倭マン's BLOG

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

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

前回に見たプロパティの取得方法を用いて、今回から、いろいろな Java オブジェクト、Groovy オブジェクトに対してプロパティを取得して見ます。

Java クラス、Groovy クラスではそれぞれ

  • Java クラスでは「class
  • Groovy クラスでは「class」、「metaClass

が常にプロパティとして認識されますが、この関連の記事では無視します。

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


まずはプロパティを取得するオブジェクトの定義。 一応載せてるだけで、別に細かく見る必要はありません。 結果は後で表にまとめています。

Java オブジェクト

Java クラスのフィールドに定義できるスコープ

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

の4つです。 加えて

  • final かどうか
  • 型が boolean かどうか*1

で分けています。

public class FieldJavaVean {

    private Object privateField;
    Object packageField;
    protected Object protectedField;
    public Object publicField;

    //********** Final **********
    private final Object privateFinalField = null;
    final Object packageFinalField = null;
    protected final Object protectedFinalField = null;
    public final Object publicFinalField = null;

    //********** Boolean **********
    private boolean privateBooleanField;
    boolean packageBooleanField;
    protected boolean protectedBooleanField;
    public boolean publicBooleanField;

    //********** Final & Boolean **********
    private final boolean privateFinalBooleanField = false;
    final boolean packageFinalBooleanField = false;
    protected final boolean protectedFinalBooleanField = false;
    public final boolean publicFinalBooleanField = false;
}

Groovy オブジェクト

Groovy クラスのフィールドに定義できるスコープ

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

の4つです。 加えて

  • final かどうか
  • 型が boolean かどうか

でも分けています。

class FieldGroovyVean {

    private Object privateField
    protected Object protectedField
    public Object publicField
    Object propertyField    // プロパティ!

    //********** Final **********
    private final Object privateFinalField
    protected final Object protectedFinalField
    public final Object publicFinalField
    final Object propertyFinalField    // プロパティ!

    //********** Boolean **********
    private boolean privateBooleanField
    protected boolean protectedBooleanField
    public boolean publicBooleanField
    boolean propertyBooleanField    // プロパティ!

    //********** Final & Boolean **********
    private final boolean privateFinalBooleanField
    protected final boolean protectedFinalBooleanField
    public final boolean publicFinalBooleanField
    final boolean propertyFinalBooleanField    // プロパティ!
}

プロパティ


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

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

です。

Java

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

スコープ final or not GroovyBeans Inspector JavaBeans MetaClass
private -
final
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
package -
final
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
protected -
final
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
public -
final
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )

Groovy

スコープ final or not GroovyBeans Inspector JavaBeans MetaClass
private -
final
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
protected -
final
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
public -
final
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
× ( × )
property -
final
☆ ( ☆ )
☆ ( ☆ )
☆ ( ☆ )
☆ ( ☆ )
☆ ( ☆ )
☆ ( ☆ )
☆ ( ☆ )
☆ ( ☆ )

まとめ

フィールドを定義した場合、Groovy のアクセス修飾子なし(プロパティ・スコープというのかな?)の場合にだけプロパティとして認識されます。

*1:boolean 型を別に見ているのは、boolean 型のプロパティのアクセッサ (getter) メソッドが isXxxx() となるためです。 今回は関係ありませんが、メソッド定義の時に分けて見ていくので、一貫性のため今回も分けています。