在阅读完C#的隐藏特性后,我想知道Java有哪些隐藏特性?
泛型方法的类型参数可以像这样明确指定:
Collections.<String,Integer>emptyMap()
public static <T> T foo(T t)
的情况下,这个技巧非常实用。你可以通过 Class.<Type>foo(t)
来调用它。 - Finbarrreturn set1.equals(set2) ? new ArrayList<String>(set1) : Collections.<String>emptyList()
。它还适用于某些方法调用,其中简单的Collections.emptyMap()
会导致编译错误。 - Andreas Holstenson你可以使用枚举类型来实现一个接口。
public interface Room {
public Room north();
public Room south();
public Room east();
public Room west();
}
public enum Rooms implements Room {
FIRST {
public Room north() {
return SECOND;
}
},
SECOND {
public Room south() {
return FIRST;
}
}
public Room north() { return null; }
public Room south() { return null; }
public Room east() { return null; }
public Room west() { return null; }
}
编辑: 多年以后...
我在这里使用了这个功能。
public enum AffinityStrategies implements AffinityStrategy {
通过使用接口,开发人员可以定义自己的策略。使用 enum
可以定义一个内置的策略集合(共五个)。
从Java 1.5开始,Java现在具有更清晰的语法来编写可变元数的函数。因此,现在你可以这样做,而不仅仅是传递一个数组:
public void foo(String... bars) {
for (String bar: bars)
System.out.println(bar);
}
bars将自动转换为指定类型的数组。这不是一个巨大的胜利,但仍然是一次胜利。
我的最爱:将所有线程堆栈跟踪转储到标准输出。
Windows操作系统:在Java cmd/console窗口中按下Ctrl+Break。
Unix操作系统:使用kill -3 PID
命令。
有几个人发表了关于实例初始化器的帖子,以下是其良好使用的示例:
Map map = new HashMap() {{
put("a key", "a value");
put("another key", "another value");
}};
如果您只是进行简单快速的操作,那么这是初始化地图的快捷方式。
或者将其用于创建快速的Swing框架原型:
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.add( new JLabel("Hey there"){{
setBackground(Color.black);
setForeground( Color.white);
}});
panel.add( new JButton("Ok"){{
addActionListener( new ActionListener(){
public void actionPerformed( ActionEvent ae ){
System.out.println("Button pushed");
}
});
}});
frame.add( panel );
JFrame frame = new JFrame(){{
add( new JPanel(){{
add( new JLabel("Hey there"){{
setBackground(Color.black);
setForeground( Color.white);
}});
add( new JButton("Ok"){{
addActionListener( new ActionListener(){
public void actionPerformed( ActionEvent ae ){
System.out.println("Button pushed");
}
});
}});
}});
}};
动态代理(自1.3版本开始)允许您在运行时定义符合接口规范的新类型。它在很多情况下都非常有用。
最终初始化可以延迟。
它确保即使有复杂的逻辑流程,返回值也总是被设置的。很容易因疏忽而错过某种情况并意外返回null。这并不意味着不可能返回null,只是明确表明这是故意的:
public Object getElementAt(int index) {
final Object element;
if (index == 0) {
element = "Result 1";
} else if (index == 1) {
element = "Result 2";
} else {
element = "Result 3";
}
return element;
}
我认为 Java 中另一个被忽视的特性就是它本身的 JVM。它可能是目前最优秀的虚拟机,而且支持许多有趣和实用的语言(Jython、JRuby、Scala、Groovy)。所有这些语言都可以轻松无缝地协作。
如果你设计一种新语言(比如 Scala),你可以立刻使用所有现有的库,并且你的语言从一开始就是“有用”的。
所有这些语言都利用了 HotSpot 优化。该虚拟机非常易于监视和调试。
您可以定义一个匿名子类,并直接调用其方法,即使它没有实现任何接口。
new Object() {
void foo(String s) {
System.out.println(s);
}
}.foo("Hello");
start()
)实际上并没有在子类中定义...... - Axeljava.util.Arrays
中的 asList 方法允许灵活使用可变参数、泛型方法和自动装箱:
List<Integer> ints = Arrays.asList(1,2,3);
Arrays.asList
具有不同寻常的特性,即您可以 set()
元素但不能 add()
或 remove()
。因此,我通常会将其包装在 new ArrayList(...)
或 Collections.unmodifiableList(...)
中,具体取决于我是否希望列表可修改。 - Christian Semrau