Java Base API中最具误导性的方法是什么?[已关闭]

2022-09-01 06:17:35

我最近试图将字符串文本转换为,当方法布尔布尔.get布尔(字符串名称)从自动完成窗口中弹出时。还有另一种方法(布尔布尔布尔.parse布尔(String s))紧随其后出现,这导致我搜索找出这两者之间的区别,因为它们似乎都做同样的事情。boolean

事实证明,真正的方法是检查是否存在给定名称的系统属性(!)以及其值为。我认为这非常具有误导性,因为我绝对不希望一种方法实际上正在调用System.getProperty,并且仅通过查看方法签名,它肯定看起来(至少对我来说)应该用于将a解析为.当然,javadoc清楚地说明了这一点,但我仍然认为该方法有一个误导性的名称,并且它不在正确的位置。其他基元类型包装器,如也有类似的方法。Boolean.getBoolean(String name)BooleanStringbooleanInteger

此外,它似乎不是一个非常有用的方法,属于基本API,因为我认为拥有这样的东西并不常见。也许对于Java职位面试来说是一个好问题:“输出是什么?我相信这些方法更合适的位置是在 System 类中,例如 ;但同样,我仍然认为没有必要在基本API中使用这些方法。将它们放在类似类的地方是有意义的,在那里进行这种类型的转换非常普遍。-Darg=trueBoolean.getBoolean("true")getPropertyAsBooleanProperties

您如何看待这一切?另外,如果您知道另一种“尴尬”的方法,请发布它。

注意:贝我知道我可以使用或将字符串文本转换为 ,但我只是想讨论API设计。Boolean.valueOfBoolean.parseBooleanboolean


答案 1

URL equals() 方法比较 IP 地址,使用网络连接,并且是阻止操作!

来自 javadocs:

如果两个主机名可以解析为相同的 IP 地址,则认为两个主机是等效的;否则,如果无法解析任一主机名,则主机名必须相等,而不考虑大小写;或两个主机名都等于 null。

由于主机比较需要名称解析,因此此操作是阻止操作。

注意:已知为 equals 定义的行为与 HTTP 中的虚拟主机不一致。

请改用 URI。


答案 2

日历类的一个众所周知的问题是月份的编号为 0 到 11,而不是 1 到 12。像这样的错误很容易出错:

Calendar cal = Calendar.getInstance();

// Set date to August 18, 2009? WRONG! Sets the date to September 18, 2009!
cal.set(2009, 8, 18);

正确的方法是使用月份的常量:

cal.set(2009, Calendar.AUGUST, 18);

但是,这种方法使得使用正常月份数字1到12的错误变得太容易了。

我认为这是日历类设计中的一个错误。