已弃用和旧版API之间的区别?

Vai*_*pai 33 java collections terminology

我正在研究Java中的遗留API,Collection Framework并且我学到了诸如Vector并且HashTable已经被ArrayList和取代的类HashMap.

但是,它们仍然不被弃用,并且在本质上被视为遗留,弃用适用于被取代且应该避免的软件功能,因此,我不确定什么时候API被认为是遗留的以及何时被弃用.

pol*_*nts 29

来自官方的Sun词汇表:

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

从何时何时弃用指南:

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

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

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

参考


请注意,官方词汇表没有定义"遗留"的含义.很可能,这可能是Josh Bloch在没有确切定义的情况下使用的术语.但是,这意味着永远不应该在新代码中使用遗留类,并且存在更好的替换.

也许使用遗留但未弃用的类的旧代码不需要任何操作,因为至少现在它们没有在将来的版本中不再存在的危险.

相反,弃用明确警告它们可能不再存在,因此应采取措施迁移到替代品.


Effective Java 2nd Edition的引用

为了比较这些术语在上下文中的使用方式,这些是本书中引用"弃用"一词的引用:

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

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

第70项:文档线程安全:该System.runFinalizersOnExit方法是线程不可用的,已被弃用.

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

相比之下,这些是出现"遗留"一词的引号:

第23项:不要在新代码中使用原始类型:它们与遗留代码的兼容性和互操作性提供,这些代码早于引入泛型.

第25项:首选列表到数组:Erasure允许泛型类型与不使用泛型的遗留代码自由互操作.

第29项:考虑类型安全异构容器:这些包装器可用于跟踪谁将错误键入的元素添加到混合泛型和遗留代码的应用程序中的集合.

项目54:明智地使用本机方法:它们提供对遗留代码库的访问,这些代码可以反过来提供对遗留数据的访问.[...]使用本机方法访问遗留代码也是合法的.[...]如果必须使用本机方法访问低级资源或旧库,请尽可能少使用本机代码并进行彻底测试.

项目69:不想并发性工具等,并通知:您应该始终使用并发工具优先于waitnotify,你可能要维持使用旧代码waitnotify.

这些引用没有经过仔细选择:它们都是书中出现"弃用""遗留"一词的所有情况.布洛赫的信息很清楚:

  • 不合适的方法,例如Thread.stop,是危险的,并且根本应该使用.
  • 另一方面,例如wait/notify可以保留在遗留代码中,但不应该在新代码中使用.

我自己的主观意见

我的解释是,弃用某些东西是承认这是一个错误,从一开始就没有好处.在另一方面,一些分类是一个传统的承认,这是在过去的不够好,但它已经功成身退,不再是现在和未来的不够好.


Tim*_*per 15

一个常见的解释是,Deprecated意味着它将在不久的将来被删除,而Legacy意味着它将保留以用于向后兼容或其他原因.

两者都意味着新代码不应该使用它们.

在JDK的情况下,即使是不推荐使用的代码也将保留,因为向后兼容性对于Java JDK非常重要.