Project Coinは、Java 7に対して小さな言語の変更を取り込むことで、開発者の日々のコーディング作業をシンプルにすることを目的としたプロジェクトである。以前InfoQの記事において、プロジェクトが作成した最初の"さらに考慮するための"カットについて見た。その提案は、switch文における文字列サポート、例外処理の改善、自動リソース管理、ジェネリック・インスタンス生成のための型推論の改善、Elvisおよびその他のnull安全な演算子、可変引数メソッド呼び出しの簡素化、で構成されている。それ以降、さらに5つの提案がリストに追加されている。
1. 整数定数をよりよくするための提案の組み合わせ。これは3つの別々の提案を組み合わせたものである。Bruce Chapman氏によって提起されたByte整数定数とShort整数定数の接尾辞は4個の新しい接尾辞、byteに対しては'y'および'Y'を、shortに対しては's'および'S'を導入することでbyte整数定数とshort整数定数のサポートを付け加えるものである。バイナリ定数はDerek Foster氏による1組の提案のうちの1つであり、数値定数を特定する形式としてすでに存在する"1"(10進数)、"01"(8進数)、"0x1"(16進数)に、新しい形式"0b1"(2進数)を付け加えるものである。Foster氏はさらに数値における下線のサポートも提案している。それにより、長い数字の列が分割され、可読性が改善される - 例えば、long creditCardNumber = 1234_5678_9012_3456L;
のように。
2. JSR 292に対する言語サポート(wiki)。John Rose氏によるこの提案は、JSR 292に由来する新しいJVM機能を利用するためのソースコードの文法を新たにつくるものである。その文法とは、invokeDynamic命令、メソッドハンドルの呼び出し、特定の変換の緩和、エキゾチック識別子、の4つである。この変更により、JavaがinvokeDynamic命令に依存している新しいJVM言語と相互に操作することができるようになるだろう。さらに、これによりjavacやJVMを新しいプログラミング言語や言語ランタイムを開発するためのプラットフォームとして利用する時に、バイトコード操作技術に頼る機会が減る。こういったものがあることで、Java言語上でのDSLの開発に目を向けている開発者にさらなる刺激を与えることに役立つはずである。
3. リストとマップに対するインデックスアクセス。Shams Mahmood Imam氏の提案は、Array、List、Mapの要素へのアクセスに対する一貫した文法を提供することを目的としており、それを使えば、次のように書くことができるようになる。
myList.get(0)
の代わりにmyList[0]
、そして、
myMap.get("key")
の代わりにmyMap["key"]
4. コレクション定数。これはリストとマップに対するインデックスアクセスとあわせて採用されることを意図したものであり、また、2つ目のImam氏からの提案と同様のものであるが、Josh Bloch氏は、不変なリスト、セット、マップ定数に対して配列初期化子と同様の文法のサポートを追加することを提案している。例を仕様から引用する。
"以下は、不変なmapを生成するために現在書いているコード片である。
final Map<Integer, String> platonicSolids;
static {
solids = new LinkedHashMap<Map<Integer, String>;
solids.put(4, "tetrahedron");
solids.put(6, "cube");
solids.put(8, "octahedron");
solids.put(12, "dodecahedron");
solids.put(20, "icosahedron");
platonicSolids = Collections.immutableMap(solids);
}以下は、map定数を利用するとどのようになるかを示したものである。
final Map<Integer, String> platonicSolids = { 4 : "tetrahedron",
6 : "cube", 8 : "octahedron", 12 : "dodecahedron", 20 : "icosahedron" };"
Bloch氏の提案はImam氏のものとは異なり、不変なコレクションのみを生成し、より簡潔で、小さなコレクションに対する最適化のためのコンパイラの作業を容易にするはずである。トレードオフとしては、実装の型を指定できないこと、そして本質的に柔軟性を欠くということがある。
5. 大きな配列(改訂版)。配列は現状int型のインデックスを持つが、開発者はその限界に到達しはじめている。James Lowden氏の提案は、32ビットint型に代わり、long型を配列のインデックスとして利用することを可能にするものである。2つの違った形も検討されている - 言語レベルの変更は、理想的かもしれないが、幾分影響が大きすぎて、それゆえにProject Coinの範疇を超えているかもしれない。ライブラリベースの変更は一時的な解決策として機能し、また、JVMレベルの変更を、もし言語に対して追加することができるようになればそのときに、利用することができるであろう。
Project Coinは計70ほどの提案を受け、そこからこの11の採用候補が載ったリストをつくった。この中から、5つか6つが、Java 7に取り込まれることが期待でき、マイルストーン6リリースで利用可能になるはずである。いったん最終カットがつくられたら、言語への変更を正式に承認するためのJSRが提出されるであろう。