Hidden Feature 系列(Java 篇)

stack overflow 上面有个 hidden feature 系列,其实是每个语言的一些“gotchas”和意外的功能。我们就从令人各种不爽的 java 开始这个系列吧。

double brace initialization

这个绝对是一个奇葩,也许你会觉得这是个啥诡异的 grammar sugar,结果人家还真不是(WTF!)

public class Foo {
  public static Map<String, String> foo = new HashMap<String, String> () ;
  static {
    foo.put ("hello", "world") ;
    foo.put ("kitty", "mitty") ;
  } ;

  public static Map<String, String> bar = new HashMap<String, String> () {{
    put ("hello", "world") ;
    put ("kitty", "mitty") ;
  }} ;

  public static void main (String [] args) {
    List<String> a = Arrays.asList ("a", "b", "c") ;
    List<String> b = new ArrayList<String> () {{
      add ("x") ; add ("y") ; add ("z") ;
    }} ;
  }
}

第一个变量的初始化我想大家都清楚,通过一个 static block 将数据加入到 static 变量里面。其实这种 block 也能是非 static 的,这样的 block 对应于一个对象创建时调用的方法。那么那个 new block 看起来像是什么?对了,anonymous inner class,还是 non-static 的。omg 难道… 里面的 {} 是… 我想你已经会意到了这个看起来神奇的东西只是两个基本概念的揉合。

ThreadLocal

如果希望构造一个成员,每个线程拿到的是不同的值,那么这个 generic class 可以帮助你管理,每个需要该对象的请求都需要 get 获得值而 put 写回去。

generic 多个父类限制

这个我们知道使用 extends/super 表示上下界,还可以用 & 表示多个限制。

classpath 通配符

JDK 6 之前必须把 jar 列出来,现在可以用 * 之类的表示匹配上的 jar 集合了。

label

break/goto 用的。记得某人贴了个笑话说才知道 C++ 支持 URL,其实 Java 也支持的!为什么 https://remonstrate.wordpress.com 是合法的呢?

Covariant return type

就是子类返回的可以是父类/接口定义的类型的子类。C++ 也支持。

instanceof 不必检查 null

虽然我从来没写过,但是这是告诉我们,真不用检查是不是 null,因为 null 不是任何类(的子类)。

try 可以不接 catch

这个时候 exception 将被忽视掉… 如果是 unchecked exception 很容易被无视哦…

enum 可以有构造函数、成员函数甚至实现 abstrct 函数或者 interface

这就是 java 增强版的 enum,甚至可以每个值存放一些相应的数据什么的。

函数可以用 generic 但是参数放在返回值以前

调用的时候,也是写在函数名前(外围类. 后面)。

可变参数

使用 … 表示,得到的是一个 iterable 的东西,似乎可以和 array 互换?

打印 thread stacktrace

可以发送 SIGQUIT,即 kill -3。

dynamic proxy

这玩意应该是很多实现的基础了,比如 mock、AOP、decorator、adapter。

final 不是一定要在声明处初始化

比如一个 final String 我如果希望根据某个 boolean 选择两个值,并不是说一定要用 ?: 写在一行里面的。一个 local 的 final 只要在这个范围内不被重复初始化就行了。而一个类的 final 一般就只能在构造函数里面来初始化了。

盗用受保护的对象

技巧很简单,没有友元,没有用 package private,你还有!reflection!

每个 .class 文件开始四个字节一样

写成 16 进制是 CAFEBABE,无语了

assert

这是语言支持的哦

javap

反编译!通过它我们可以将 .class 变成“可以看懂”的 byte code。帮助我们了解像 groovy/scala 之类的干了啥。

array 囧事

你可以写 String [] a = {“a”, “b”} ;然后传递给某 void foo(String []),比如 foo(a),但是不能写 foo({“a”, “b”})。

关于 url 的囧事

据说 new URL(“http://www.yahoo.com&#8221;).equals(new URL(“http://209.191.93.52&#8221;))

jvm 结束的 hook

通过 Runtime.getRuntime().addShutdownHook 添加一些东西,如清理 in-memory db 什么的。

jmap

显示 heap 等信息。

——————
My father peradventure will feel me, and I shall seem to him as a deceiver; and I shall bring a curse upon me, and not a blessing.

Advertisements
Hidden Feature 系列(Java 篇)

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s