Project Threeten

プロジェクト3時10分なのかとも思えるロゴだけど、JSR 310で提案されているDate and Time APIがOpenJDKに入ろうとしているみたい。っていうか、RIがOpenJDKにまだ入っていないことが意外な感じだけど、現状はSourceForgeでホストされて、コードはgithubにあるみたい。プロジェクトサイトはここ。まぁ、Java 8に入る予定みたいだから、覚えれば良いかね。そんな感じでメモ的な感じ。

JDK 7 Features

Java 8の新機能を追わなきゃなっとか思っていて、Java 7は大したものなさそうだからスルーしようかと思っていたけど、ここを見ると細かいのがいろいろあるな。

  • JSR 292: Support for dynamically-typed languages (InvokeDynamic)
  • Strict class-file checking
  • JSR 334: Small language enhancements (Project Coin)
  • Upgrade class-loader architecture
  • Method to close a URLClassLoader
  • Concurrency and collections updates (jsr166y)
  • Unicode 6.0
  • Locale enhancement
  • Separate user locale and user-interface locale
  • JSR 203: More new I/O APIs for the Java platform (NIO.2)
  • NIO.2 filesystem provider for zip/jar archives
  • SCTP (Stream Control Transmission Protocol)
  • SDP (Sockets Direct Protocol)
  • Use the Windows Vista IPv6 stack
  • TLS 1.2
  • Elliptic-curve cryptography (ECC)
  • JDBC 4.1
  • XRender pipeline for Java 2D
  • Create new platform APIs for 6u10 graphics features
  • Nimbus look-and-feel for Swing
  • Swing JLayer component
  • Gervill sound synthesizer
  • Update the XML stack
  • Enhanced MBeans

言語仕様に関係するとことか、NIO2あたりとか、一度きちんと見たほうが良いのかも。まぁ、Java 8までは使わなそうな気はするけど。

JSR 335: Lambda expressions

Java 8で導入される予定のラムダ式。Javaの世界だと、Java 5 で遭遇した以上の変化が起きるかもしれない。まぁ、仕様としては、JSR 335 みたいだけど、OpenJDKのところにラムダに関する説明もある。これをすごくざっとまとめると、ラムダ式はクロージャーとか匿名メソッドみたいなやつのこと。今まで

button.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    ui.dazzle(e.getModifiers());
  }
});

みたいにやっていたかもしれないけど、

button.addActionListener((ActionEvent e) -> {ui.azzle(e.getModifiers()});

みたいなことができるようになる。そんなわけで、

new Thread(() -> {
  connectToService();
  sendNotification();
}).start();

ということも普通に起きる感じ。そんで、興味深いのが Target Typing。上記の例のnew Thread()の引数に与えた()->{…}の型が推論されてRunnableになるっぽい。なので、

Callable c = () -> "done";

とすれば、それはCallableになるし、

Comparator c = (s1, s2) -> s1.compareToIgnoreCase(s2);

とすれば、Comparatorになるようだ。そんでもって、省略とかもありっぽいから、

button.addActionListener(e -> ui.dazzle(e.getModifiers()));

というようにいろいろとなくなる…。そして、以下のような状況で勝手に推論して状況に応じて決まるみたい。

  • 変数宣言の型
  • 引数の型
  • 戻りの型
  • 配列のパラメータ型
  • メソッドやコンストラクタの引数
  • ラムダ式の本文
  • ?:の条件式
  • キャストの型

まぁ、いろんな状況で型をよろしくやっておくよ、という感じだな。そんで、JavaScriptとかではお馴染みのレキシカルスコープ。
あとは、既存のメソッドとかも渡すことができるみたい。

class Person {
  private final String name;
  private final int age;
  public static int compareByAge(Person a, Person b) { ... }
  public static int compareByName(Person a, Person b) { ... }
}
Person[] people = ...
Arrays.sort(people, Person::compareByAge);

つまり、::で指定する。上記はstaticなメソッドだけど、インスタンスのメソッドに対してもhoge::doRunみたいなことができるみたい。さらに、コンストラクタもできるみたいで

SocketImplFactory factory = MySocketImpl::new;

という例もある。あとは、defaultの話もあるけど、知りたければラムダの説明を読んでね。