当前位置: 首页 > 面试题库 >

为什么java.util.Properties实现Map 而不是地图

方坚壁
2023-03-14
问题内容

java.util.Properties类是代表一地图,其中键和值都是字符串。这是因为Properties对象用于读取.properties文件,即文本文件。

那么,为什么他们在Java 5中Map<Object,Object>不对此类进行改造以实现Map<String,String>呢?

该javadoc的状态:

因为Properties是从Hashtable继承的,所以put和putAll方法可以应用于Properties对象。强烈建议不要使用它们,因为它们允许调用方插入键或值不是字符串的条目。应该改用setProperty方法。如果在包含非字符串键或值的“受损”属性对象上调用store或save方法,则调用将失败。

由于键和值都应该是字符串,那么为什么不通过使用适当的泛型类型静态地强制执行呢?

我想使Properties实现工具Map<String,String>与为Java
5之前的版本编写的代码不能完全向后兼容。如果您有将非字符串粘贴到Properties对象中的旧代码,则该代码将不再与Java
5一起编译。但是……不是。那是一件好事吗?泛型不是在编译时捕获此类类型错误的全部目的吗?


问题答案:

因为他们在Java的早期就匆匆忙忙地做到了,并且没有意识到后来的四个版本会带来什么影响。

从一开始,泛型就应该成为Java设计的一部分,但是由于过于复杂并且在当时没有必要,该功能被删除了。结果,标准库中的许多代码都是在非通用集合的假设下编写的。马丁·奥德斯基(Martin
Odersky)的原型语言“ Pizza”展示了如何在使用Java代码和字节码保持几乎完美的向后兼容性的同时很好地完成它们。原型导致Java 5,在Java
5中,集合类用泛型改型,以允许旧代码继续工作。

不幸的是,如果他们要追溯Properties从继承Map<String, String>,则以下先前有效的代码将停止工作:

Map<Object, Object> x = new Properties()
x.put("flag", true)

为什么有人这样做,这超出了我的范围,但是Sun对Java向后兼容的承诺已经超出了英雄范围,变得毫无意义。

现在,大多数受过良好教育的观察者都赞赏的是,它们Properties根本不应该继承Map。相反Map,它应该环绕起来,仅公开那些有意义的Map功能。

自从重新发明Java之后,Martin
Odersky便继续创建新的Scala语言,该语言更干净,继承更少的错误并在许多领域开辟了新天地。如果您发现Java的烦人烦人,请看一看。



 类似资料:
  • 我有什么理由使用 而不是 输出应该是相同的,我所做的基准测试似乎表明稍微快一点(需要评估所有非标准评估输入)。 那么,对于如此简单的情况,有什么理由让我考虑切换到< code>purrr::map呢?我在这里不是问你喜欢或不喜欢purrr提供的语法和其他功能。,但严格来说是关于< code>purrr::map与< code>lapply的比较,假设使用标准评估,即< code>map(

  • 我试图理解背后的动机。如果已经存在类型类和,为什么有必要呢? 诚然,的实例是具体的类型,而的实例需要一个类型参数。(有关有用的解释,请参见Monoid vs MonadPlus。)但是你不能重写任何类型的约束吗 作为和的组合? 从。它的实施是: 我只能使用和实现它: 有人能澄清和之间的真正区别吗?

  • 考虑到类有三个字段name(String)、age(int)、salary(double)。 我想创建一个名为键,值为工资的映射(而不是对象本身),如果键不唯一,则使用linkedList保存所有重复键的值。 如何实现这种场景?

  • 问题内容: 我已经在Android代码中使用FloatBuffers一段时间了(从一些opengles教程中复制了它),但是我无法确切地理解此构造是什么以及为什么需要它。 例如,我在许多人的代码和android教程中看到了以下代码(或类似代码): 就我所知,这似乎是冗长和混乱的,我只是说它们只是一个浮点数的包装而已。 问题: 与任何其他类型的float集合或简单数组相反,这种类型的类(ByteBu

  • 问题内容: 对于Java的处理方式以及涉及到的数字和其他类型的数字,我有些困惑。例如: 输出(也许您应该先猜测一下): 这不能编译是可以预料的,是不同的对象。 令我有些惊讶的是,默认情况下9是an ,并且1)甚至没有编译。请注意,您不能将放入期望使用的方法中,但是在这里它们是相等的。 由于两个相同的原因,这令人惊讶,但似乎更糟。 不足为奇,因为自动装箱到和。 不足为奇,因为不同类中的对象不应该是。