如果在Java中使用不推荐的方法/函数,会出现什么问题?

如果在Java中使用不推荐的方法/函数,会出现什么问题?,java,deprecated,Java,Deprecated,在Java中使用不推荐使用的函数是否会出现任何问题??如果是这样,他们为什么保留这个功能??如果在类似Java的语言中使用不推荐的方法,这是一个坏习惯吗 java.sql.Date.getMonth或getYear或getDate?尚未删除任何方法,因此现有代码将继续运行。Sun一直非常关注向后兼容性 主要的好处是远离那些由于某种原因工作不理想的代码,通常在运行库的其他地方会有一个替换代码。因此,使用它们是一个坏习惯,当编译器标记不推荐时,您应该注意并使用推荐的替换。消除编译器警告通常是一个好主

在Java中使用不推荐使用的函数是否会出现任何问题??如果是这样,他们为什么保留这个功能??如果在类似Java的语言中使用不推荐的方法,这是一个坏习惯吗
java.sql.Date.getMonth
getYear
getDate

尚未删除任何方法,因此现有代码将继续运行。Sun一直非常关注向后兼容性

主要的好处是远离那些由于某种原因工作不理想的代码,通常在运行库的其他地方会有一个替换代码。因此,使用它们是一个坏习惯,当编译器标记不推荐时,您应该注意并使用推荐的替换。消除编译器警告通常是一个好主意


您可以看到Javadocs中不推荐使用的内容的列表。Java 5列表位于

未来代码可能会中断

不推荐使用的函数表示此函数将消失的警告

现在就寻找其他方法来解决问题,否则你会的
将来有代码中断

不推荐使用的类或方法可能会在将来的版本中被删除。Sun有一个习惯,就是不推荐某些东西,而且从不实际删除它。在我看来,这不太好,因为它使使用不推荐的方法看起来没问题。不过,在可能的情况下,您不应该使用不推荐使用的方法(而且应该总是可能的)。这尤其适用于外部库,我通常不像Sun那样害怕删除不推荐的代码。

一些潜在的问题是:

  • 方法可能不再存在(实践中从未出现过这种情况,但根据官方定义,不推荐的方法可能会从未来的Java中消除)
  • 由于不推荐使用的方法(例如,
    System.runFinalizersOnExit
    及其孪生兄弟
    Runtime.runFinalizersOnExit
    )中的致命缺陷,可能会出现严重的编程错误
  • 由于固有的不安全弃用方法(例如
    Thread.stop
    )可能导致数据损坏
工具书类
    • 弃用:指不再推荐的类、接口、构造函数、方法或字段,在将来的版本中可能不再存在
相关问题

保留不推荐使用的方法,以便为早期版本的Java编写的代码仍能正常工作。如果他们只是删除了代码,那么当您将Java更新到新版本时,以前运行的代码将停止工作


使用不推荐使用的函数不会给您带来任何问题,除了导致该方法不推荐使用的问题之外。但是,最好找出是什么取代了不推荐的方法。不推荐使用的功能将被替换为可能在新类中找到的新功能。许多不推荐使用的日期功能已移至日历。查看Javadoc以查看推荐的替换方法。

正如其他人所指出的,Sun从未从JDK中删除过任何不推荐的方法,但第三方库中不推荐的方法却不是这样。这些有时确实会消失(例如,Lucene项目在这里有一个相当“流畅”的API,使用主要版本进行主要清理)

即使在JDK中,被弃用的方法也意味着“现在有更好的方法来实现这一点”,您可能应该更新代码以使用新版本


很少有不推荐的方法不能正确地执行它最初打算执行的操作,但是替换方法通常会更可靠,或者在更多情况下,或者以更一般的方式工作。这里的好例子是您提到的日期函数(不推荐使用,因为它们不能很好地用于不同的语言环境/日历),或者仅适用于7位ASCII的字符串到字节转换。如果没有新的接口,这些警告/限制将无法修复,或者因为有人可能依赖于“已损坏”的实现,所以他们没有更新该方法,而是弃用它并提供一个替代方法。

这些实际上已被日历所取代。get method很好,SUN/Oracle没有删除任何弃用的方法,这取决于你是否继续用那些不推荐的方法编写新的应用程序。但有一些旧的实用程序、应用程序或其他一些我们和公司自2002年以来一直在使用的东西,例如。。。而且没有必要更改该应用程序的代码……我认为这是错误的,不必如此。以Perl为例。它由来已久,大量的程序都是用它编写的,但仍然有一些东西在一个版本中被弃用,在下一个版本中被删除,没有任何痕迹。告诉成千上万拥有传统应用的公司,它们的生计取决于它们的运行。是的,对你来说这似乎是错误的,但是从别人的角度来看。保留不推荐使用的函数也很简单,请参见“为什么
线程.停止
线程.挂起
线程.恢复
运行时.runFinalizersOnExit
不推荐使用?”但是我如何使用Calendar.get(Calendar.MONTH)而不是Date.getMonth()??我从数据库中得到一个java.sql.Date,我需要得到它的month…Date.getMonth()是保存以供使用的,您只需要习惯0=一月,11=十二月这一事实,这有点违反直觉。因为java.sql.Date依赖于java.util.Date,所以java.util.Date不会消失。我猜这是不推荐的,因为它是一个糟糕的API,与“异国情调”日历不兼容。在您列表中的3项中,只有1项是真正的问题(第一项)。其他两个问题与其说是“可绕过的保护”不如说是问题。相关:Herb Sutter的文章,摘自他关于有效并发的系列文章。您应该阅读