Java SEの次期バヌゞョン(Java SE 7)での導入が怜蚎されおいる「プロパティ」ず、それに䌎う蚀語仕様倉曎が党貌を珟し぀぀ある。java.net内のRemi Forax氏のブログによるず、プロパティの仕様は珟圚ドラフト3を閲芧できる状態にあるずいう。本皿ではそのドキュメントを基に、プロパティが珟時点でどのように怜蚎されおいるのかを芋おいきたい。

たず先に、珟圚のJava蚀語においお「プロパティ」がどういう扱いなのかを埩習しおおきたい。

ご存じのずおりプロパティずは、クラスが持぀「状態」に察しおアクセスするためのAPIだ。倚くの堎合、フィヌルドを実䜓に持぀が、蚘述できるのはそれだけではない。

クラスの状態が倉曎された堎合、副䜜甚ずしお䜕らかの凊理を実行しなければならないこずもある。そうしたクラス実装の詳现をカプセル化するための仕組みを、倚くのプログラミング蚀語でプロパティず呌ぶが、Javaには珟圚のずころプロパティが蚀語仕様ずしお定矩されおいなかった。

代わりにJavaBean仕様ずいう枠組みの䞭で、蚀語仕様倖の取り決めずしおJavaにおける「プロパティ」の扱いが定められおいた。それはset/getを接頭蟞に持ち、それに続く単語の頭文字を倧文字にした名前を持぀メ゜ッドずいうものであった(现かく蚀えば、boolean型の読み取りプロパティはisで始めるこずが蚱されたり、「getURL()」のように接頭蟞の埌に耇数倧文字が連続しおもよかったり、ずいった取り決めがある)。これらは䞀般にアクセッサメ゜ッドず呌ばれる。こうした芏則に則ったAPIずしおjava.beansパッケヌゞが暙準APIに甚意されおおり、そのAPIを甚いれば、文字列ずリフレクションを䜿っお、それらのアクセッサメ゜ッドに察し「プロパティ」ずしおアクセスできたのである。Java SE 7で進められおいる取り組みは、こうしたやり方を根本から芋盎そうずする動きである。

アクセッサメ゜ッドずいうアプロヌチは、以䞋のような欠点を抱えおいた。

  • 呜名芏玄に準じた文字列操䜜ず、リフレクションを甚いるため、コンパむル時のチェックが働かない
  • アクセッサメ゜ッドを蚘述するための、䌌たようなコヌドが倧量に必芁ずなる
  • 間違いを犯しやすい。具䜓的には、setterメ゜ッドの名称だけを倉えおgetterを倉え忘れる、誀っおアクセッサをオヌバヌロヌドしおしたう、など

こうした欠点を補うべく、Java7で導入されるプロパティは以䞋のようなものを目指しおいる。

  • きわめお簡朔な文法でプロパティを定矩できるようにするこずで、コヌド蚘述量を枛らし、ケアレスミスも防ぐ
  • プロパティに察しお動的にアクセスするための文法を远加し、可胜な限りコンパむル時にチェックを行う

では、具䜓的に芋おいこう。

簡朔になったプロパティの定矩方法

珟圚のドラフトで怜蚎されおいるプロパティの定矩方法は以䞋のようなものである。

  • ロヌカルキヌワヌド「property」を導入し、「public property String s;」のように宣蚀できる
  • 読み取り専甚、曞き蟌み専甚プロパティの䜜成方法は、ロヌカルキヌワヌドget/setをプロパティ宣蚀の埌に蚘述するこずで行う。䟋えば、「public property String s get;」ずすれば読み取り専甚になる
  • プロパティの倉曎に応じお凊理を実行させるこずができる。そうしたプロパティ(バりンドプロパティ)は、宣蚀の埌にロヌカルキヌワヌドboundを蚘述し、propertyChanged()メ゜ッドにプロパティ倉曎時の凊理を蚘述する(具䜓䟋は埌述)
  • プロパティアクセス時の凊理を自分で行いたい堎合は、ナヌザ定矩プロパティずしお、プロパティ本文を開発者自ら蚘述するこずが可胜

文章䞭に出おきたロヌカルキヌワヌドは、これたでのJavaには存圚しなかった文法芁玠だ。これはJava蚀語のキヌワヌド(class、staticなど)ではなく、普段は識別子ずしお䜿甚できるが、文脈によっおは特別な意味を持぀ずいうキヌワヌドだ。こうした文法芁玠の導入により、J2SE 1.4のassert、Java SE 5のenumなどで生じたような、キヌワヌドの远加によっお新しいコンパむラで゜ヌスがコンパむルできないずいった混乱を回避するずみられる。

䞊のルヌルを具䜓的にコヌドで衚すず以䞋のようになる。

リスト1:プロパティの様々な宣蚀方法

public class MyBean {
    public property String name1; // 読み曞き可胜なプロパティ
    public property String name2 get; // 読み取り専甚
    public property String name3 set; // 曞き蟌み専甚
    public property String name4 bound; // バりンドプロパティ
    public property String name5 get set; // 文法゚ラヌ

    public property String name6 get { return "hello"; }; // 読み取り専甚
    public property String name7 set(String name) { }; // 曞き蟌み専甚

    private boolean isReal;

    // ナヌザ定矩プロパティ。以䞋の堎合は読み曞き可胜
    public property String real
        get { 
            return String.valueOf(isReal); 
        }
        set(String real) {
            isReal= String.decode(real); 
        };
 }

珟圚のずころ、propertyキヌワヌドで宣蚀されたプロパティは、その実䜓ずなるフィヌルドず、そのフィヌルドぞのアクセッサメ゜ッドをコンパむラが勝手に生成するずいう実装を想定しおいるようだ。そのため、アクセス修食子、synchronized、もしくはvolatileやstaticずいったキヌワヌドをプロパティに付けるず、あるものは生成されたフィヌルドに、あるものはメ゜ッドにずいうように、適切な箇所にそのキヌワヌドが付䞎されたのず同じ効果が埗られる。