JavaBaseAPI中最容易引起误解的方法是什么?

JavaBaseAPI中最容易引起误解的方法是什么?,java,methods,naming-conventions,Java,Methods,Naming Conventions,我最近正试图将字符串文字转换为布尔值,这时该方法从自动完成窗口弹出。之后还出现了另一个方法(),这让我开始搜索,以找出这两个方法之间的区别,因为它们似乎都做了相同的事情 原来Boolean.getBoolean(字符串名)真正做的是检查给定名称是否存在系统属性(!),以及其值是否为true。我认为这是非常误导的,因为我绝对不期望布尔值的方法实际上是在调用,并且仅仅通过查看方法签名,它看起来(至少对我来说)确实应该被用来将字符串解析为布尔值。当然,javadoc清楚地说明了这一点,但我仍然认为该方

我最近正试图将字符串文字转换为布尔值,这时该方法从自动完成窗口弹出。之后还出现了另一个方法(),这让我开始搜索,以找出这两个方法之间的区别,因为它们似乎都做了相同的事情

原来
Boolean.getBoolean(字符串名)
真正做的是检查给定名称是否存在
系统
属性(!),以及其值是否为
true
。我认为这是非常误导的,因为我绝对不期望
布尔值的方法实际上是在调用,并且仅仅通过查看方法签名,它看起来(至少对我来说)确实应该被用来将
字符串
解析为
布尔值
。当然,javadoc清楚地说明了这一点,但我仍然认为该方法有一个误导性的名称,而且它不在正确的位置。其他原语类型包装器,如
Integer
也有类似的方法

另外,它似乎不是一个非常有用的方法,因为我认为像
-Darg=true
这样的东西并不常见。对于Java职位面试来说,这可能是一个好问题:“Boolean.getBoolean(“true”)
的输出是什么?”。我认为这些方法更适合放在类中,例如,
getPropertyAsBoolean
;但是,我仍然认为没有必要在基本API中使用这些方法。将它们放在
Properties
类中是有意义的,在该类中进行这种类型的转换非常常见

你对这一切有何看法?此外,如果你知道还有另一种“尴尬”的方法,请发布它


N.B.我知道我可以使用
Boolean.valueOf
Boolean.parseBoolean
将字符串文字转换为
Boolean
,但我只是想讨论一下API的设计。

我同意。我一直对这些方法感到不舒服

我甚至在我们的代码库中发现了一个bug,它是由某人使用Integer.getInteger()解析字符串而没有意识到它正在查找属性引起的

当然,不幸的是,出于向后兼容性的原因,无法删除API

String.getBytes()
通常是应用程序中出现大量愚蠢的字符编码问题的原因,因为它使用底层平台字符编码。


不填充数组;相反,它读取任意数量的字节并返回该数字。你必须循环。讨厌,因为它在大多数情况下对小型阵列都能正常工作。我不认为任何人在第一次使用它时就正确了。

我不确定是否有人仍然使用它,但如果出现问题,则来自
DocumentBuilder.parse()的错误消息(几乎?)总是“prolog中不允许内容”。即使真正的原因完全是其他原因。

URL等于()方法比较IP地址,使用网络连接,是一个阻塞操作

从javadocs:

如果两个主机名都可以使用,则认为两个主机是等效的 断然的 输入相同的IP地址;否则,如果其中一个主机名不能 已解决,主机名必须相等,不考虑大小写;或者两者都有 主机名等于null

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

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


改用URI。

Calendar类的一个众所周知的问题是月份的编号是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的错误


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

我的问题是String的substring方法;每次我使用它时,我都要写出“汉堡包”和“汉堡包”两个词。子串(4,8)=“敦促”记住如何正确使用它

这可能不是最糟糕的方法,但我从不喜欢:

假设x是已知仅包含字符串的列表。以下代码可用于将列表转储到新分配的字符串数组中:


将大小为0的字符串数组传递给该方法对我来说似乎既疯狂又不直观。

刚刚了解了
线程的方法和类。从
javadoc

static boolean interrupted()
// Tests whether the current thread has been interrupted.
boolean isInterrupted()
// Tests whether this thread has been interrupted.

问题是
interrupted
除了执行测试外,实际上还清除了中断状态,而
isInterrupted
只是测试状态。

bigdecim.setScale(int)返回bigdecimic hmmm的setter

一些redditor注意到String.substring会导致内存泄漏,因为在内部它不复制子字符串,而只是复制指向整个字符串+偏移量+长度的指针。所以,如果您希望GC收集整个字符串,那么您就完蛋了

我不会把它放在“最尴尬”下,但是java.security.MessageDigest.getInstance()给了我一些困惑

我通常看到“getInstance()”方法返回一个单例

如果一个方法要返回一个新实例,我可能希望在MessageDigest类上看到一个MessageDigestFactory.newInstance(),或者至少看到一个newInstance(),而不是它们的getInstance()方法

见:


根据我的测试,MessageDigest.getInstance()每次调用都会返回一个新实例。

那么,System.setOut()将把值设置为系统的最终成员

>我从未真正理解为什么JDBC-API始终以1开始计数,而java(C++、C、C、……)的其余部分从0开始。这
static boolean interrupted()
// Tests whether the current thread has been interrupted.
boolean isInterrupted()
// Tests whether this thread has been interrupted.
List<Integer> l = new ArrayList<Integer>();
l.add(20);
l.remove(20); // throws ArrayIndexOutOfBoundsException, because it will try to access index 20
l.remove(new Integer(20)); // this works