在Java中使用Deprecated方法或类是错误的吗?

时间:2010-05-31 07:05:08

标签: java methods deprecated

我正在使用eclipse开发一个Web应用程序。就在今天,我通过更改JAR文件更新了我的struts版本。我在一些地方收到警告,说这些方法已被弃用,但代码工作正常。

我想知道一些事情

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

  2. 如果我不更改任何方法并使用我的警告运行我的应用程序,会产生任何性能问题。

15 个答案:

答案 0 :(得分:256)

  

<强> 1。在Java中使用不推荐使用的方法或类是不对的吗?

来自the definition of deprecated

  

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

该方法保留在API中,以便在未指定的时间段内向后兼容,并且可以在将来的版本中删除。也就是说,不,它不是错误的,但有一种更好的方法可以做到这一点,这对API的变化更为强大。

  

<强> 2。如果我不更改任何方法并使用我的警告运行我的应用程序,它会产生任何性能问题。

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


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

  

已过时。从JDK版本1.1.1开始,由getMaxDescent()。

取代

答案 1 :(得分:27)

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

答案 2 :(得分:21)

术语

来自官方的Sun词汇表:

  

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

从何时何时弃用指南:

  

你可能已经听过“自我贬低的幽默”这个词,或者说幽默,可以最大限度地减少说话者的重要性。不推荐使用的类或方法就是这样。它不再重要。事实上,你不应该再使用它,因为它已被取代并且将来可能不再存在,这是非常不重要的。

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

  

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

参考


是对还是错?

使用弃用方法是对还是错的问题必须根据个人情况进行审查。以下是所有 “已弃用”一词出现在 Effective Java 2nd Edition 中的引号:

  

第7项:避免使用终结者:声称保证最终确定的唯一方法是System.runFinalizersOnExit及其邪恶双胞胎Runtime.runFinalizersOnExit。这些方法存在致命缺陷,已被弃用。

     

项目66:同步对共享可变数据的访问:这些库提供了Thread.stop方法,但这种方法很久以前就已弃用,因为它本身就是不安全 - - 它的使用可能导致数据损坏。

     

项目70:记录线程安全性System.runFinalizersOnExit方法是线程不可用的,已被弃用。

     

第73项:避免线程组:它们允许您同时将某些Thread原语应用于一堆线程。其中一些原语已被弃用,其余原语很少使用。 [...]线程组已经过时。

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

使用其他方法,您必须单独考虑这些问题,并了解为什么它们被弃用,但一般来说,当弃用的决定合理时,它往往会倾向于错误而不是继续使用它们的权利。

相关问题

答案 3 :(得分:17)

除了上面的所有优秀回复之外,我发现删除已弃用的API调用还有另一个原因。

研究为什么不推荐使用调用我经常发现自己在学习有关Java / API / Framework的有趣内容。通常有一个很好的理由可以推断某种方法,并了解这些原因会带来更深入的见解。

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

答案 4 :(得分:11)

肯定不会产生性能问题 - 已弃用意味着将来很可能该功能不再是库的一部分,因此您应该避免在新代码中使用它更改旧代码以停止使用它,因此有一天升级struts并发现该函数不再存在时不会遇到问题

答案 5 :(得分:8)

你可能听过这个词,“自嘲幽默”。这是幽默,可以最大限度地减少你的重要性。不推荐使用的类或方法就是这样。它不再重要。事实上,它根本不应该被使用,因为它可能在将来不再存在。

尽量避免

答案 6 :(得分:7)

这没错,只是不推荐。这通常意味着在这一点上有更好的做事方式,如果你使用新的改进方式,你会做得很好。一些被弃用的东西真的很危险,应该完全避免。新方法可以产生比被弃用方式更好的性能,但情况并非总是如此。

答案 7 :(得分:4)

  1. 一般情况下,只要你有一个很好的应急计划来避免任何问题,如果/当这些方法从你正在使用的库中消失时,使用deprecated方法并非绝对错误。使用Java API本身就不会发生这种情况,但几乎任何事情都意味着它将被删除。如果你特别打算不升级(虽然你很可能应该长期)你的软件的支持库,那么使用deprecated方法没有问题。
  2. 没有

答案 8 :(得分:3)

是的,这是错误的。

在Java的未来版本中将删除不推荐使用的方法或类,不应使用它们。在每种情况下,都应该有一种替代方案。使用它。

在某些情况下,您必须使用已弃用的类或方法才能实现项目目标。在这种情况下,你真的别无选择,只能使用它。 Java的未来版本可能会破坏该代码,但如果这是一个要求,您必须接受它。为了满足项目要求,这可能不是你第一次做错事,而且肯定不会是最后一次。

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

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

答案 9 :(得分:2)

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

答案 10 :(得分:2)

  

在Java中使用Deprecated方法或类是不对的?“

没有错,但它可以为您省去一些麻烦。这是一个强烈建议不要使用弃用方法的例子:

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

  

为什么不推荐使用Thread.stop?

     

因为它本质上是不安全的。   停止线程会导致它解锁   它已锁定的所有监视器。   (监视器解锁为   ThreadDeath异常传播   堆栈。)如果有任何对象   以前受这些监视器保护   其他人处于不一致的状态   线程现在可以查看这些对象   不一致的状态。这样的对象   据说被损坏了。当线程   对受损物体进行任意操作   行为可能导致。这种行为可能   微妙,难以察觉,或   它可能会发音。与其他不同   未经检查的异常,ThreadDeath   线索无声地杀死线程;因此,用户   并没有警告他的计划可能   损坏。腐败可以表现出来   本身在实际之后的任何时间   发生损坏,甚至数小时或数天   未来。


  

如果不更改任何方法并使用我的警告运行我的应用程序,它会产生任何性能问题。

在性能方面应该没有问题。标准API旨在尊重一些向后兼容性,因此应用程序可以逐步适应新版本的Java。

答案 11 :(得分:2)

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

假设存在与方法关联的安全漏洞,并且开发人员确定它是一个设计缺陷。因此他们可能会决定弃用该方法并引入新方法。

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

如果不更改任何方法并使用我的警告运行我的应用程序会产生任何性能问题。

如果弃用是由性能问题引起的,那么您将遇到性能问题,否则没有理由遇到此类问题。再次想指出,请注意弃用的原因。

答案 12 :(得分:1)

在Java中它是@Deprecated,在C#中它是[已废弃]。

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

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

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

如果您使用的是不推荐使用的代码,那么它通常很好,只要您不必升级到更新的API - 那里可能不存在已弃用的代码。我建议如果你看到使用弃用代码的东西,要更新以使用更新的替代品(这通常在注释或Javadoc弃用的注释中指出)。

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

答案 13 :(得分:1)

当然没有 - 因为整个Java正在获得@Deprecated :-),只要Java持续,你就可以随意使用它们。不管怎么说都不会注意到任何差异,除非它真的被打破了。意义 - 必须阅读它然后再决定。

在.Net中,当声明某些内容[已过时]时,即使您之前从未使用它,也要立即阅读它 - 您有大约50%的可能性比使用它更有效和/或更容易使用: - ))

所以一般来说,现在技术保守是非常有益的,但是你必须先做读书工作。

答案 14 :(得分:0)

我觉得弃用的方法意味着;有一个备用= ive方法可用,它在各个方面都比现有方法更好。最好使用比现有旧方法更好的方法。为了向后兼容,旧方法保留为弃用。