在阅读了c#的隐藏特性之后,我想知道Java的隐藏特性有哪些?
当前回答
阅读约书亚·布洛赫的《爪哇谜题》,你会受到启发,也会感到恐惧。
其他回答
这并不是一个真正的功能,而是我最近在一些网页上发现的一个有趣的技巧:
class Example
{
public static void main(String[] args)
{
System.out.println("Hello World!");
http://Phi.Lho.free.fr
System.exit(0);
}
}
是一个有效的Java程序(尽管它会生成警告)。 如果你不明白为什么,请看格雷戈里的回答!;-)好吧,这里的语法高亮也给了一个提示!
这并不是一个真正的隐藏功能,但当我看到这个编译好的时候,它确实给了我一个很大的惊喜:
public int aMethod(){
http://www.google.com
return 1;
}
它被编译的原因是编译器将http://www.google.com行“http:”部分视为标签,而该行的其余部分是注释。
所以,如果你想写一些奇怪的代码(或模糊的代码),只要在那里放很多http地址。: -)
在枚举中允许使用方法和构造函数让我感到惊讶。例如:
enum Cats {
FELIX(2), SHEEBA(3), RUFUS(7);
private int mAge;
Cats(int age) {
mAge = age;
}
public int getAge() {
return mAge;
}
}
你甚至可以有一个“常量特定类主体”,它允许特定的枚举值覆盖方法。
更多文档请点击这里。
几个月前当我第一次发现它时,双括号初始化让我感到惊讶,以前从未听说过它。
作为存储每个线程状态的一种方式,ThreadLocals通常并不广为人知。
由于JDK 1.5 Java已经有了非常好的实现和健壮的并发工具,而不仅仅是锁,它们存在于Java .util.concurrent中,一个特别有趣的例子是Java .util.concurrent.atomic子包,它包含线程安全的原语,实现比较和交换操作,并可以映射到这些操作的实际本机硬件支持版本。
如果你做了很多JavaBean开发,并且使用了属性更改支持,你通常会写很多这样的setter:
public void setFoo(Foo aFoo){
Foo old = this.foo;
this.foo = aFoo;
changeSupport.firePropertyChange("foo", old, aFoo);
}
我最近无意中发现了一篇博客,它提出了一个更简洁的实现,使代码更容易编写:
public void setFoo(Foo aFoo){
changeSupport.firePropertyChange("foo", this.foo, this.foo = aFoo);
}
它实际上简化了事情,以至于我能够在Eclipse中调整setter模板,从而自动创建方法。
推荐文章
- 在Selenium中等待页面加载
- Maven父pom vs模块pom
- 将JSON数据转换为Java对象
- Java的隐藏特性
- 使用Java 8的可选Stream::flatMap
- 使用管道字符("|")分割字符串
- 在IntelliJ中找不到Maven插件
- Java List.add() UnsupportedOperationException
- 连接两个字节数组的简单方法
- 为什么Mockito不模拟静态方法?
- Volatile boolean vs AtomicBoolean
- 在一个类中使用相同的方法实现两个接口。覆盖了哪个接口方法?
- 线程的上下文类装入器和普通类装入器之间的区别
- 如何在Java中正确地比较两个整数?
- 在Java中获取“unixtime”