在阅读完C#的隐藏特性后,我想知道Java有哪些隐藏特性?
使用this关键字从内部类中访问包含类的字段/方法。在下面这个有些牵强险峻的例子中,我们想要从匿名内部类中使用容器类的sortAscending字段。使用ContainerClass.this.sortAscending而不是this.sortAscending就可以解决问题。
import java.util.Comparator;
public class ContainerClass {
boolean sortAscending;
public Comparator createComparator(final boolean sortAscending){
Comparator comparator = new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
if (sortAscending || ContainerClass.this.sortAscending) {
return o1 - o2;
} else {
return o2 - o1;
}
}
};
return comparator;
}
}
MyActivity.this
来获取上下文,例如从按钮的监听器中获取。 - espinchi这并不是一个功能,而是我最近在某个网页上发现的一种有趣的技巧:
class Example
{
public static void main(String[] args)
{
System.out.println("Hello World!");
http://Phi.Lho.free.fr
System.exit(0);
}
}
这是一个有效的Java程序(尽管它会生成警告)。 如果您不明白原因,请参见Gregory的答案!;-) 好吧,这里的语法突出显示也提示了一下!
虽然这不完全是“隐藏功能”,也没有什么用处,但在某些情况下可能会非常有趣:
sun.misc.Unsafe类 - 允许您在Java中实现直接内存管理(如果您尝试很多次甚至可以编写自修改的Java代码):
public class UnsafeUtil {
public static Unsafe unsafe;
private static long fieldOffset;
private static UnsafeUtil instance = new UnsafeUtil();
private Object obj;
static {
try {
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
unsafe = (Unsafe)f.get(null);
fieldOffset = unsafe.objectFieldOffset(UnsafeUtil.class.getDeclaredField("obj"));
} catch (Exception e) {
throw new RuntimeException(e);
}
};
}
在使用 Swing 的时候,我喜欢隐藏的 Ctrl - Shift - F1 功能。
它可以打印出当前窗口的组件树。
(假设你没有将该快捷键绑定到其他功能上。)
CountDownLatch
和CyclicBarrier
——非常有用! - Raphael语言级别的assert关键字。
虽然并不是 Java 语言的一部分,但随 Sun JDK 附带的 javap 反汇编器并不被广泛知晓或使用。
在1.5版本中引入了for-each循环结构。我非常喜欢它。
// For each Object, instantiated as foo, in myCollection
for(Object foo: myCollection) {
System.out.println(foo.toString());
}
它可以在嵌套实例中使用:
for (Suit suit : suits)
for (Rank rank : ranks)
sortedDeck.add(new Card(suit, rank));
对于数组,for-each循环同样适用,并且它隐藏的是索引变量而不是迭代器。以下方法返回int数组中值的总和:
// Returns the sum of the elements of a
int sum(int[] a) {
int result = 0;
for (int i : a)
result += i;
return result;
}
i
会非常令人困惑,因为大多数人希望i
是索引而不是数组元素。 - cdmckay我个人相对较晚才发现了 java.lang.Void
-- 与泛型一起使用可以提高代码可读性,例如 Callable<Void>