首页 文章

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

提问于
浏览
143

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

我想知道一些事情

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

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

15 回答

  • 252

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

  • 19

    术语

    来自官方的Sun词汇表:

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

    从何时何时弃用指南:

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

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

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

    参考文献


    是对还是错?

    使用弃用方法是对还是错的问题必须逐个审查 . 以下是有效Java第二版中出现"deprecated"一词的 ALL 引号:

    第7项:避免终结者:声称保证最终确定的唯一方法是System.runFinalizersOnExit及其邪恶的双胞胎Runtime.runFinalizersOnExit . 这些方法存在致命缺陷,已被弃用 . 项目66:同步对共享可变数据的访问:库提供了Thread.stop方法,但是这个方法很久以前就被弃用了,因为它本身就不安全 - 它的使用会导致数据损坏 . 第70项:文档线程安全:System.runFinalizersOnExit方法是线程不可用的,已被弃用 . 第73项:避免线程组:它们允许您同时将某些Thread原语应用于一堆线程 . 其中一些原语已被弃用,其余原语很少使用 . [...]线程组已过时 .

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

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

    相关问题

  • 1

    我觉得弃用的方法意味着;有一种可用的替代方法,它在现有方法的各个方面都比较好 . 比现有的旧方法更好地使用好的方法 . 为了向后兼容,旧方法保留为已弃用 .

  • 2

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

    Try to avoid it

  • 2

    除了上面的所有优秀响应,我发现还有另一个原因可以删除已弃用的API调用 .

    正在研究为何拒绝调用我经常发现自己在学习有关Java / API / Framework的有趣内容 . 通常有一个很好的理由说明为什么要弃用某个方法,并且了解这些原因可以获得更深入的见解 .

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

  • 8

    Is it wrong to use Deprecated methods or classes in Java? 它不是"wrong",仍在工作但尽可能避免它 .

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

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

    what if don't change any method and run my application with warnings that I have, will it create any performance issue.

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

  • 7

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

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

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

    为什么不推荐使用Thread.stop?因为它本质上是不安全的 . 停止线程会导致它解锁所有线程监视它已锁定 . (当ThreadDeath异常向上传播时,监视器将被解锁 . )如果先前受这些监视器保护的任何对象处于不一致状态,则其他线程现在可以以不一致的状态查看这些对象 . 据说这些物体已被损坏 . 当线程对受损对象进行操作时,可能会导致任意行为 . 这种行为可能很微妙并且难以检测,或者可能是明显的 . 与其他未经检查的异常不同,ThreadDeath会以静默方式杀死线程;因此,用户没有警告他的程序可能被破坏 . 腐败可以在实际损害发生后的任何时间显现,甚至在未来几小时或几天 .


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

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

  • 10

    您仍然可以在不改变性能的情况下使用已弃用的代码,但是弃用方法/类的重点是让用户知道现在有更好的方法使用它,并且在将来的版本中,可能会删除已弃用的代码 .

  • 17

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

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

    所以总的来说,现在技术保守是非常有益的,但你必须先做你的阅读家务 .

  • 1

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

  • 4

    Yes, it is wrong.

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

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

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

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

  • 0

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

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

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

    对于Java的@Deprecated也是如此 - 您仍然可以使用该方法,但风险自负 - 将来,它可能有更好的替代方案,甚至可能不受支持 .

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

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

  • 27

    它当然不会产生性能问题 - deprecated 意味着将来它不再是库的一部分,所以你应该避免在新代码中使用它并更改旧代码以停止使用它,所以你不要有一天当您升级struts并发现该函数不再存在时遇到问题

  • 3
    • 一般不会,使用 deprecated 方法并不是绝对错误的,只要你有一个很好的应急计划,以避免任何问题,如果/当这些方法从图书馆你're using. With Java API itself this never happens but with just about anything else it means that it'将被删除 . 如果你特别打算不升级(虽然你很可能长远来看)你的软件's supporting libraries then there'使用 deprecated 方法没问题 .

  • 2

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

    来自the definition of deprecated

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

    该方法保留在API中以便在未指定的时间段内向后兼容,并且可以在将来的版本中删除 . 也就是说,不,这没有错,但有一种更好的方法,它可以更好地抵御API变化 .

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

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


    Java API中的 funniest deprecation 是imo,即FontMetrics.getMaxDecent . 弃用原因:拼写错误 .

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

相关问题