倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

果たしてそれが(どれが)プロパティなのか? (3) :メソッドが定義されているオブジェクト

前回に続き、今回はメソッドが定義されている Java オブジェクト、Groovy オブジェクトに対してプロパティを取得して見ます。

対象とするオブジェクトの定義


プロパティを取得するオブジェクトの定義。

Java オブジェクト

Java クラスのメソッドに定義できるスコープ

  • public
  • デフォルト(指定なし)
  • protected
  • public

の4つです。 加えて、プロパティの型が boolean の場合はアクセッサ (getter) メソッドが isXxxx() となっている場合も考えます。 また、

  • アクセッサ (getter) メソッドのみの場合 (ReadOnly)
  • ミューテータ (setter) メソッドのみの場合 (WriteOnly)

でも分けています。

public class JavaVean {

    //********** Object **********
    private Object getPrivate(){return null;}
    private void setPrivate(Object value){}

    Object getPackage(){return null;}
    void setPackage(Object value){}

    protected Object getProtected(){return null;}
    protected void setProtected(Object value){}

    public Object getPublic(){return null;}
    public void setPublic(Object value){}

    //********** Boolean **********
    private boolean isPrivateBoolean(){return false;}
    private void setPrivateBoolean(Object value){}

    boolean isPackageBoolean(){return false;}
    void setPackageBoolean(Object value){}

    protected boolean isProtectedBoolean(){return false;}
    protected void setProtectedBoolean(Object value){}

    public boolean isPublicBoolean(){return false;}
    public void setPublicBoolean(Object value){}

    //********** Read Only **********
    private Object getPrivateReadOnly(){return null;}
    Object getPackageReadOnly(){return null;}
    protected Object getProtectedReadOnly(){return null;}
    public Object getPublicReadOnly(){return null;}

    private boolean isPrivateReadOnly(){return false;}
    boolean isPackageReadOnly(){return false;}
    protected boolean isProtectedReadOnly(){return false;}
    public boolean isPublicReadOnly(){return false;}

    //********** Write Only **********
    private void setPrivateWriteOnly(Object value){}
    void setPackageWriteOnly(Object value){}
    protected void setProtectedWriteOnly(Object value){}
    public void setPublicWriteOnly(Object value){}
}

Groovy オブジェクト

Groovy クラスのメソッドに定義できるスコープ

  • public
  • protected
  • public (指定なし)

の3つです。 あとは Java オブジェクトの場合と同じです。

class GroovyVean {

    //********** Object **********
    private Object getPrivate(){null}
    private void setPrivate(value){}

    protected Object getProtected(){null}
    protected void setProtected(value){}

    Object getPublic(){null}
    void setPublic(value){}

    //********** Boolean **********
    private boolean isPrivateBoolean(){null}
    private void setPrivateBoolean(value){}

    protected boolean isProtectedBoolean(){null}
    protected void setProtectedBoolean(value){}

    boolean isPublicBoolean(){null}
    void setPublicBoolean(value){}
    
    //********** Read Only **********
    private Object getPrivateReadOnly(){null}
    protected Object getProtectedReadOnly(){null}
    Object getPublicReadOnly(){null}

    private boolean isPrivateReadOnly(){false}
    protected boolean isProtectedReadOnly(){false}
    boolean isPublicReadOnly(){false}

    //********** Write Only **********
    private void setPrivateWriteOnly(value){}
    protected void setProtectedWriteOnly(value){}
    void setPublicWriteOnly(value){}
}

プロパティ


では、「プロパティかどうか」の結果です。

  • 」はプロパティとして認識される
  • ×」はプロパティとして認識されない

です。

Java

()内は boolean 型の場合です。 この関連の記事では常にそうします。 Object ( boolean )

スコープ Read/Write GroovyBeans Inspector JavaBeans MetaClass
private Read/Write
Read Only
Write Only
☆ ( × )
☆ ( × )
×
☆ ( ☆ )
☆ ( × )
× ( × )
× ( × )
×
☆ ( ☆ )
☆ ( × )
package Read/Write
Read Only
Write Only
☆ ( × )
☆ ( × )
×
☆ ( ☆ )
☆ ( × )
× ( × )
× ( × )
×
☆ ( ☆ )
☆ ( × )
protected Read/Write
Read Only
Write Only
☆ ( × )
☆ ( × )
×
☆ ( ☆ )
☆ ( × )
× ( × )
× ( × )
×
☆ ( ☆ )
☆ ( × )
public Read/Write
Read Only
Write Only
☆ ( ☆ )
☆ ( ☆ )
×
☆ ( ☆ )
☆ ( ☆ )
☆ ( ☆ )
☆ ( ☆ )
☆ ( ☆ )
☆ ( ☆ )

Groovy

スコープ Read/Write GroovyBeans Inspector JavaBeans MetaClass
private Read/Write
Read Only
Write Only
☆ ( × )
☆ ( × )
×
☆ ( ☆ )
☆ ( × )
× ( × )
× ( × )
×
☆ ( ☆ )
☆ ( × )
protected Read/Write
Read Only
Write Only
☆ ( × )
☆ ( × )
×
☆ ( ☆ )
☆ ( × )
× ( × )
× ( × )
×
☆ ( ☆ )
☆ ( × )
public Read/Write
Read Only
Write Only
☆ ( ☆ )
☆ ( ☆ )
×
☆ ( ☆ )
☆ ( ☆ )
☆ ( ☆ )
☆ ( ☆ )
☆ ( ☆ )
☆ ( ☆ )

まとめ

JavaBeans のプロパティはアクセス修飾子が public でないと不可。

その他の Groovy 関連のプロパティはアクセス修飾子は関係なし(少なくともプロパティ情報を取得する分には。 メソッド実行時に例外が発生したりするかも知れませんが、試してません。)

また、public でないものでは isXxxx() のような boolean のアクセッサは認識されないものが多いようです。 とりえあえず、少なくとも public なアクセッサ (getter) メソッドがあればプロパティとして認識されると思っておけば間違いないかな。

「Inspector」によるプロパティと「MetaClass」によるプロパティは同じ。 Java オブジェクトと Groovy オブジェクトも同じと扱われるようですね。 まぁ、それは Groovy のコンセプトの1つではありますが。

Groovyイン・アクション

Groovyイン・アクション


Jakarta Commonsクックブック ―Javaプロジェクト必須のレシピ集

Jakarta Commonsクックブック ―Javaプロジェクト必須のレシピ集