プロジェクト3時10分なのかとも思えるロゴだけど、JSR 310で提案されているDate and Time APIがOpenJDKに入ろうとしているみたい。っていうか、RIがOpenJDKにまだ入っていないことが意外な感じだけど、現状はSourceForgeでホストされて、コードはgithubにあるみたい。プロジェクトサイトはここ。まぁ、Java 8に入る予定みたいだから、覚えれば良いかね。そんな感じでメモ的な感じ。
カテゴリー: Java
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の話もあるけど、知りたければラムダの説明を読んでね。