Java属性是否已经被有效废弃?

26

自Java 5之前以来,Java的Properties对象并没有发生很大的改变,并且它没有泛型支持或非常有用的辅助方法(例如定义插入类以处理属性或帮助加载目录中的所有属性文件的模式)。

开发Properties已经停止了吗?如果是这样,那么当前的最佳实践是什么,可以用于保存/加载此类属性?

还是我完全错过了些什么?


那么java.util.Dictionary呢?它已经更新为使用泛型,但它也长期以来被记录为“过时”。然而,它仍未标记为@deprecated。我猜弃用是一个棘手的问题。 - omerkudat
@omerkudat,字典在1.2版本的集合框架中之前就是一种映射。虽然它没有正式被弃用,但它与向量(Vector)处于同一组别。通常不建议使用它。https://dev59.com/WnM_5IYBdhLWcg3waieJ - Yishai
5个回答

11

在属性(Properties)方面的许多概念都是古老而有问题的。它的国际化非常差,添加方法今天通过泛型类型就可以轻松实现,它扩展了Hashtable,后者通常不再使用,因为其同步功能有限,并且它的方法与1.2引入的集合类不协调。Properties类添加的许多方法本质上提供的是一种类型安全性,这种类型安全性已由泛型所取代。

如果今天实施,它可能会成为Map<String, String>的特殊实现,并且肯定会支持更好的属性文件编码。

话虽如此,还没有一个替代品不会增加复杂性。当然,java.util.prefs.Preferences api是“新的和改进”的,但它增加了远远超出许多用例需求的复杂度层次。使用XML也是一种选择(至少解决了国际化问题),但属性对象通常完全满足需求,那么就可以使用它。


通常情况下,为了国际化,您会使用ResourceBundle API。请查看http://java.sun.com/developer/technicalArticles/javase/i18n_enhance/和http://bordet.blogspot.com/2007/01/utf-8-handling-for-resourcebundle-and.html。 - BalusC
2
@BalusC 我猜Yishai指的是属性文件编码的怪癖,称其为“国际化差”,而ResourceBundle默认使用相同的编码。 - Christian Semrau

7

对于简单的配置需求,它仍然是可行的解决方案。因为属性键和值本质上是字符串,存储在扁平的ASCII文件中,所以它们不需要泛型支持。如果您需要对象的反/序列化,Properties不是正确的方法。现在更喜欢使用java.util.prefs.Preferences方法,用于任何超出中等复杂配置需求的情况。


3
它做了它需要做的事情。编写支持读取目录中所有属性文件并不难。我认为这不是常见用例,因此我认为不需要将其放入JDK中。另外,自Java 5之前它已经略有改变,如Javadoc所述,它扩展了Hashtable<Object,Object>并实现了Map<Object,Object>

2
关于为什么使用Hashtable<Object,Object>而不是Hashtable<String,String>请参见:https://dev59.com/i3NA5IYBdhLWcg3wrPyq - Tom Hawtin - tackline

3

"它没有泛型支持," 为什么需要泛型支持; 它处理字符串键和字符串值。我不认为Java属性已过时。它是一个成熟的库 - 就这样。


3
它实际上涉及到对象键和对象值——如果想要限制为字符串键和字符串值,你需要使用泛型。 - brabster
该类提供了字符串键和字符串值的便利函数。 - dbrown0708
2
基于对象的API由于设计不良而渗入到Properties中。创建它的人忽略了:“优先选择组合而非继承”,尽管意图是不同的(如在Java文档中所述:“Properties类表示一个持久的属性集。属性可以保存到流中或从流中加载。属性列表中每个键及其相应的值都是一个字符串。”) 。 - ring bearer

1

1
Collections Map接口及其实现似乎是Java对关联数组的正式解决方案 - 在我看来,Properties更多地是一种便利性的东西。 - brabster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接