在Java中使用不推荐使用的方法或类是错误的吗?


153

我正在使用eclipse开发Web应用程序。就在今天,我已经通过更改JAR文件更新了我的struts版本。我在某些地方收到不赞成使用方法的警告,但是代码可以正常工作。

我想知道一些事情

  1. 在Java中使用不推荐使用的方法或类是错误的吗?

  2. 如果我不更改任何方法并在有警告的情况下运行我的应用程序,将会造成性能问题。


7
你会“继续”来驱动你的1955 Volkswagen Beetle,即使你是提供Corvette Stingray,免费的吗?(0:
KMån

75
@KMan,您正在将欧洲车与美国车进行比较吗?;)
蓬萨2010年

2
@庞曹和4其他人:知道!(0;
KMån

2
错误?我们在这里说的是凡间的事还是只是在轻蔑?
FastAl

5
@Alexander对您的评论没有投票,因此也对您的评论+1;)在任何情况下,请耐心等待新代码比旧代码好1000。比较会之间进行更好的1955 Volkswagen Beetle1956 Volkswagen Beetle新的轮胎,你不知道什么时候会打破!
Aleks 2014年

Answers:


265

1.在Java中使用不赞成使用的方法或类是错误的吗?

弃用的定义

注释为@Deprecated的程序元素是不鼓励程序员使用的元素,通常是因为这样做很危险,或者因为存在更好的替代方法。

该方法在API中保留了一段时间,以便在向后兼容的过程中保持未指定的时间,并且将来可能会删除该方法。就是说,不,这没有,但是有一种更好的方法可以做到这一点,它对API更改更健壮。

2.如果我不更改任何方法并在有警告的情况下运行我的应用程序,将会造成性能问题。

很可能没有。它会像弃用前一样继续工作。API方法的合同不会更改。如果某些内部数据结构发生变化,而采用一种新的更好的方法,则可能会对性能产生影响,但这种可能性很小。


最有趣的弃用 Java API中,是海事组织,FontMetrics.getMaxDecent。弃用原因:拼写错误。

不推荐使用。从JDK版本1.1.1开始,由getMaxDescent()取代。


5
Java API中最有趣的弃用方法是AbstractButton(Swing)中的setMultiClickThreshhold(int threshhold)和getMultiClickTreshhold()。为这两个做好准备!;)
JavaTechnical

3
我们需要使用HTTP REFERER进行此操作。令人发疯:en.wikipedia.org/wiki/HTTP_referer
kmiklas

1
@DaveMcClelland,从69:D达到了70;)
VdeX

28

您仍然可以在不改变性能的情况下使用不推荐使用的代码,但是不推荐使用方法/类的全部目的是让用户知道现在有一种更好的使用方法/类,并且在将来的版本中,不推荐使用的代码可能会被删除。


1
您如何确定性能不变?该deprication 可能例如是由于内部数据结构的变化,从一个HashSet到一个TreeSet,例如说。
aioobe

@aioobe-就我的理解而言,OP询问调用不赞成使用的代码是否存在任何性能问题,这并不是因为它不会更改产生的字节码(1.5以前是在javadoc中使用的,现在正在使用注释,但是性能仍然没有变化)
Abyx

从库的一个版本转到另一个版本时,不能保证新版本中方法的字节代码与先前版本中相同方法的字节代码相同。
aioobe

@aioobe-有一个保证就是,仅使其过时就不会更改字节码,这就是我认为OP的意思。当然,代码本身也会发生变化,这就是为什么我们不赞成使用代码。
abyx

如果您继续使用与以前相同的版本,则不会有任何变化。但是,如果您使用的是较新版本的库,并且没有弃用该API,则可能会发生性能变化,如果基本实现发生了重大变化,并且新API充分利用了它,而旧API却没有相对于这种较新的结构,它曾经是高效的。
gregturn

21

术语

从Sun官方词汇表中:

弃用:指不再推荐的类,接口,构造函数,方法或字段,并且在以后的版本中可能不再存在。

从何时弃用指南:

您可能已经听说过“自嘲的幽默”一词,或使演讲者的重要性降至最低的幽默。弃用的类或方法就是这样。它不再重要。实际上,它是如此不重要,以致您不再应该使用它,因为它已被取代,并且将来可能不再存在。

@Deprecated注释更进一步,并警告危险:

注释的程序元素@Deprecated是不鼓励程序员使用的元素,通常是因为这样做很危险,或者因为存在更好的替代方法。

参考文献


对还是错?

使用不赞成使用的方法是对还是错的问题必须逐个检查。这是在有效Java 2nd Edition中出现“不赞成”一词的所有引号:

项目7:避免终结器:声称保证终结的唯一方法是System.runFinalizersOnExit及其邪恶的孪生兄弟Runtime.runFinalizersOnExit。这些方法存在致命缺陷,已被弃用。

项目66:同步访问共享的可变数据:库提供了该Thread.stop方法,但是很久以前不赞成使用此方法,因为它本质上是不安全的 -使用该方法可能会导致数据损坏。

项目70:文档线程安全性:该System.runFinalizersOnExit方法是线程恶意的,已被弃用。

项目73:避免线程组:它们使您可以一次将某些Thread原语应用于一堆线程。这些原语中有几个已被弃用,其余的则很少使用。线程组已过时。

因此,至少对于所有上述方法,至少根据Josh Bloch的说法,使用它们显然是错误的。

使用其他方法时,您必须单独考虑问题,并理解为什么不建议使用这些问题,但总的来说,如果决定弃用是合理的,则倾向于倾向于错误而不是继续使用它们。

相关问题


3
“已弃用”来自拉丁语“ de” +“ precare”,意为“祈祷”。当某事物被描述为不赞成使用时,标准就是在祈祷-乞求-您不要使用它;这是一个警告,可能会在该标准的将来版本中将其删除。请注意,在该标准的当前版本的任何实现中都必须完全实现不推荐使用的功能。不过,您对自嘲的幽默的提法有些不合时宜。从这个意义上说,“自贬”是“自贬”的一种腐败,它具有不同的派生和含义。
dajames

17

除了上述所有出色的响应之外,我发现还有另一个原因可以删除不赞成使用的API调用。

在研究为什么不赞成使用电话的过程中,我经常发现自己对Java / API /框架感兴趣。通常有一个很好的理由为什么不赞成使用一种方法,而理解这些原因可以带来更深刻的见解。

因此,从学习/成长的角度来看,这也是值得的


11

它当然不会造成性能问题- 不建议使用,这意味着将来该函数可能不再是该库的一部分,因此您应避免在新代码中使用它,并更改旧代码以停止使用它,因此升级struts并发现该功能不再存在的一天,您不会遇到任何问题


1
从经验来看,“已弃用”的意思实际上是“您不应再使用它,但是它将永远可用。” 至少对于Java Standard API,我不知道在弃用之后实际上从未删除过任何方法或类。
Michael Borgwardt

1
@Michael Well,实际上,API很少删除不推荐使用的函数,因为它们可能会被弃用十年,而编译器输出“警告:请停止使用”,人们仍然会在最终将其删除的那一天倒霉。我认为不赞成使用的意思是“总有一天我们想删除它,所以请停止使用它”,即使实际上它很少真正发生
Michael Mrozek 2010年

@Michael Mrozek:不同意这个说法It certainly doesn't create a performance issue;它太主观,不能这么说。
KMån

1
@KMan被标记为已弃用的函数不会以某种方式使其效率低于标记前的效率-它的运行方式与之前完全相同
Michael Mrozek 2010年

@Michael Borgwardt:这就是大多数标准化语言的工作方式。而且,当然,如果要从标准中删除任何不赞成使用的东西,流行的实现会将其保留为扩展。
David Thornley,2010年

8

没错,只是不推荐。通常,这意味着到现在为止,有一种更好的做事方法,如果您使用改进的新方法,您会做得更好。一些过时的东西确实很危险,应该完全避免。新方法可以产生比已弃用的方法更好的性能,但并非总是如此。


8

您可能听说过“自嘲的幽默”一词。那是幽默,使您的重要性降至最低。弃用的类或方法就是这样。它不再重要。实际上,它是如此不重要,以至于根本不再使用它,因为它将来可能会不复存在。

尽量避免


4
  1. 通常不,使用deprecated方法并不是绝对错误的,只要您有一个好的应急计划以避免/当这些方法从正在使用的库中消失时就可以避免任何问题。对于Java API本身,这永远不会发生,但是对于其他任何事情,这意味着它将被删除。如果您明确计划不升级(尽管从长远来看很可能应该升级)您的软件支持库,那么使用deprecated方法就没有问题。
  2. 没有。

3

是的,这是错误的。

不推荐使用的方法或类将在Java的将来版本中删除,并且不应使用。在每种情况下,都应该有替代方法。用那个

在几种情况下,必须使用不赞成使用的类或方法才能实现项目目标。在这种情况下,您实际上别无选择,只能使用它。Java的未来版本可能会破坏该代码,但是如果必须这样做,则必须使用它。也许这不是您第一次为了满足项目要求而做错事,而且肯定不会是最后一次。

当您升级到Java的新版本或某些其他库时,有时您所使用的方法或类将被弃用。不支持不建议使用的方法,但不应产生意外的结果。但这并不意味着它们不会,所以请尽快切换代码。

弃用过程可确保作者有足够的时间将其代码从旧的API更改为新的API。利用这段时间。尽快更改您的代码。


2

没错,但是在软件的将来版本中已删除了一些不推荐使用的方法,因此您最终可能无法使用代码。



1
@KMan-在您发布的链接中写道:“该方法在API中保留了一段未指定的向后兼容性,可能在以后的版本中删除。” 我已经写过同样的东西-一些不推荐使用的方法可能在不久或将来被删除。
Petar Minchev,2010年

2

在Java中使用不推荐使用的方法或类是错误的吗?”

没错,但是可以为您省些麻烦。这是一个强烈建议不要使用不推荐使用的方法的示例:

http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

为什么不赞成使用Thread.stop?

因为它本质上是不安全的。停止线程会使它解锁它已锁定的所有监视器。(当ThreadDeath异常在堆栈中向上传播时,监视器将被解锁。)如果以前由这些监视器保护的任何对象处于不一致状态,则其他线程现在可能会以不一致状态查看这些对象。据说这些物体已损坏。当线程对损坏的对象进行操作时,可能会导致任意行为。此行为可能是微妙的,难以检测,或者可能是明显的。与其他未检查的异常不同,ThreadDeath会无声地杀死线程。因此,用户没有警告其程序可能已损坏。在实际损坏发生后的任何时间,甚至未来数小时或数天,腐败都会显现出来。


如果不更改任何方法并在有警告的情况下运行我的应用程序,会造成性能问题吗?

在性能方面应该没有问题。标准API的设计考虑到某些向后兼容性,因此应用程序可以逐渐适应Java的较新版本。


2

在Java中使用不推荐使用的方法或类是错误的吗? 这不是“错误”,仍在工作,但应尽可能避免。

假设存在与方法相关联的安全漏洞,并且开发人员确定这是设计缺陷。因此,他们可能决定弃用该方法并介绍新方法。

因此,如果您仍然使用旧方法,则将面临威胁。因此,请注意弃用的原因,并检查它是否对您有影响。

如果不更改任何方法并在有警告的情况下运行我的应用程序,会造成性能问题吗?

如果弃用是由于性能问题引起的,那么您将遭受性能问题的困扰,否则就没有理由出现这种问题。再次想指出,请注意不赞成使用的原因。


2

在Java中,它已@Deprecated,在C#中,它已[已淘汰]。

我想我更喜欢C#的术语。这只是意味着它已过时。如果愿意,您仍然可以使用它,但是可能有更好的方法。

如果您认为Windows 3.1已过时,就像使用Windows 3.1而不是Windows 7。您仍然可以使用它,但是将来的版本中可能会有更好的功能,而且将来的版本可能会受支持-不会过时的版本。

与Java的@Deprecated相同-您仍然可以使用该方法,但后果自负-将来,它可能会有更好的替代方法,甚至可能不受支持。

如果您使用的是不推荐使用的代码,那么通常就可以,只要您不必升级到较新的API-那里可能不存在不推荐使用的代码。我建议如果您看到使用不赞成使用的代码的东西,以进行更新以使用较新的替代方法(通常在注释或Javadoc不赞成使用的注释中指出)。

编辑:正如迈克尔所指出的那样,如果过时的原因是由于功能中的缺陷(或者因为该功能甚至不应该存在),那么显然,不应使用过时的代码。


1
“如果您使用的代码已被弃用,那很好,只要您不必升级到较新的API即可。”-并非如此。查看为什么不推荐使用Thread.stop(),并且您会发现在任何JRE版本中它都不适合。
迈克尔

好的,我宁愿说“通常”很好(会更新该位):)因此,使用风险自负。显然,如果不赞成使用它是为了阻止其功能缺陷,那么最好不要使用它。一般来说,使用不推荐使用的方法是可以的。所以,这一切都取决于弃用的原因。真正。
jamiebarrow

1

当然不是-因为整个Java都已@Deprecated :-),只要Java持续使用,您就可以随意使用它们。无论如何都不会注意到任何差异,除非它确实被破坏了。含义-必须先阅读一下然后再决定。

但是,在.Net中,如果某项声明为[过时],则即使您从未使用过,也要立即阅读它-与替换相比,它有50%的机会更有效率和/或更容易使用:-))

因此,总的来说,这几天保持技术保守可能会非常有益,但是您必须先做好阅读工作。


1

我觉得不推荐使用的方法意味着什么;有一种可供选择的替代方法,在所有方面都比现有方法更好。比现有的旧方法更好地使用好的方法。为了向后兼容,不建议使用旧方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.