Joã*_*lva 36 java methods naming-conventions
boolean当方法boolean Boolean.getBoolean(String name)弹出自动完成窗口时,我最近尝试将字符串文字转换为a .之后还boolean Boolean.parseBoolean(String s)出现了另一种方法(),这使我找到了解这两者之间的差异,因为他们似乎都做了同样的事情.
事实证明,Boolean.getBoolean(String name)真正做的是检查是否存在System给定名称的属性(!)以及它的值是否为true.我认为这是非常误导的,因为我绝对没想到一个方法Boolean实际上正在调用System.getProperty,只是通过查看方法签名,它肯定看起来(至少对我来说)它应该用来解析一个String作为boolean.当然,javadoc清楚地说明了这一点,但我仍然认为该方法有一个误导性的名称,并且它不在正确的位置.其他原始类型的包装器,Integer也有类似的方法.
此外,它似乎不是一个非常有用的方法属于基础API,因为我认为有类似的东西并不常见-Darg=true.对于Java职位面试来说,这可能是一个很好的问题:"输出是Boolean.getBoolean("true")什么?".我相信这些方法更合适的地方就是在System课堂上,例如getPropertyAsBoolean; 但同样,我仍然认为在基础API中使用这些方法是不必要的.将它们放在类似于Properties类的东西中是有意义的,这种类型的转换很常见.
你觉得这一切怎么样?此外,如果你知道另一个"尴尬"的方法,请发布它.
NB我知道我可以使用Boolean.valueOf或Boolean.parseBoolean将字符串文字转换为a boolean,但我只是想讨论API设计.
dog*_*ane 43
URL equals()方法比较IP地址,使用网络连接并且是阻塞操作!
来自javadocs:
如果两个主机名都可以解析为相同的IP地址,则认为两个主机是等效的.否则,如果无法解析任何一个主机名,则主机名必须相等而不考虑大小写; 或两个主机名都等于null.
由于主机比较需要名称解析,因此此操作是阻止操作.
注意:已知已定义的equals行为与HTTP中的虚拟主机不一致.
请改用URI.
Jes*_*per 31
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);
Run Code Online (Sandbox Code Playgroud)
正确的方法是使用几个月的常量:
cal.set(2009, Calendar.AUGUST, 18);
Run Code Online (Sandbox Code Playgroud)
但是这种方法很容易犯下使用正常月份数1到12的错误.
我认为这是Calendar类设计中的一个错误.
Joã*_*lva 26
刚拿到这一个从这里,关于add和remove方法List(参数与时Integer).例如:
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
Run Code Online (Sandbox Code Playgroud)
Jon*_*Jon 11
String.getBytes()
Run Code Online (Sandbox Code Playgroud)
通常是应用程序中许多愚蠢字符编码问题的原因,因为它使用底层平台字符编码.
刚刚发现了方法isInterrupted和interrupted课程Thread.来自javadoc:
static boolean interrupted()
// Tests whether the current thread has been interrupted.
boolean isInterrupted()
// Tests whether this thread has been interrupted.
Run Code Online (Sandbox Code Playgroud)
问题是,除了进行测试之外,interrupted实际上会清除中断状态,而isInterrupted只是测试状态.
这可能不是最糟糕的方法,但我从来不喜欢这个:
假设x是已知仅包含字符串的列表.以下代码可用于将列表转储到新分配的String数组中:
String[] y = x.toArray(new String[0]);
Run Code Online (Sandbox Code Playgroud)
将大小为0的String数组传递给方法看起来很疯狂,对我来说不直观.
不填充阵列; 相反,它读取任意数量的字节并返回该数字.你必须循环.令人讨厌,因为它大部分时间都适用于小型阵列.我认为没有人在他们第一次使用它时就做对了.
一些redditor注意到String.substring会导致内存泄漏,因为在内部它不会复制子字符串,而只是将指针复制到整个字符串+ offset + length.因此,如果您希望GC收集整个字符串,那么您就搞砸了.
http://www.reddit.com/r/programming/comments/8ydvg/the_dangers_of_stringsubstring/c0au0gj
我的问题是使用String的substring方法; 每次我使用它时我都要写出"hamburger"和"hamburger"这个词.substring(4,8)="urge"来记住如何正确使用它
好吧,System.setOut()会将值设置为System 的最终成员!!!!
我同意。我一直对这些方法感到不舒服。
我什至在我们的代码库中发现了一个错误,该错误是由某人使用 Integer.getInteger() 解析字符串而没有意识到它正在查找属性引起的。
当然,不幸的是,出于向后兼容性的原因,API 无法被删除。
| 归档时间: |
|
| 查看次数: |
3165 次 |
| 最近记录: |