倭マン's BLOG

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

果たしてそれが(どれが)プロパティなのか? (4) :アクセッサとミューテータで異なる型が宣言されている場合

今回はアクセッサ (getter) メソッドとミューテータ (setter) メソッドで異なる型が宣言されている場合を見ていきます。

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


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

Java オブジェクト

アクセッサとミューテータで型が異なるようにしますが、それらが親子関係はないようにします。 Java で定義されている4つのアクセス修飾子についてそれぞれアクセッサ、ミューテータを定義しましょう。 また、isXxxx() という名前のアクセッサは返り値が boolean にしか使わないと思うので、ミューテータの型を boolean 以外にしています:

public class TypeDifferentJavaVean {
    
    private Number getPrivate(){return null;}
    private void setPrivate(String value){}

    Number getPackage(){return null;}
    void setPackage(String value){}

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

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

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

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

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

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

Groovy オブジェクト

Groovy の場合も、Java と同じようにアクセス修飾子のそれぞれについてアクセッサ、ミューテータを定義しています:

class TypeDifferentGroovyVean {

    private Number getPrivateType(){null}
    private void setPrivateType(String value){}

    protected Number getProtectedType(){null}
    protected void setProtectedType(String value){}

    Number getPublicType(){null}
    void setPublicType(String value){}

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

    protected boolean isProtectedBoolean(){false}
    protected void setProtectedBoolean(String value){}

    boolean isPublicBoolean(){false}
    void setPublicBoolean(String value){}
}

プロパティ


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

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

です。

Java

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

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

Groovy

スコープ GroovyBeans Inspector JavaBeans MetaClass
private ☆ ( × ) ☆ ( ☆ ) × ( × ) ☆ ( ☆ )
protected ☆ ( × ) ☆ ( ☆ ) × ( × ) ☆ ( ☆ )
public ☆ ( ☆ ) ☆ ( ☆ ) ☆ ( ☆ ) ☆ ( ☆ )

まとめ

今回の場合でも、Java オブジェクトと Groovy オブジェクトは同じものとして扱ってよいようです。 また、宣言が public なら、Java だろうが Groovy だろうが、getXxxx() だろうが isXxxx() だろうが、プロパティとして認識されます。
Groovyイン・アクション

Groovyイン・アクション