環境
- Eclipse Pleiades 4.7.2(Build id: 20171218-0600)
- Java8(1.8.0_152)
- lombok 1.6.20(プロジェクトに取り込んだlombokとEclipseにインストールしたlombokは同じバージョン)
検証
lombokで生成されたgetterが、重複する場合の動きをまとめました。
フィールドa
とA
が存在する場合
フィールドa
とA
から、どちらもgetA()
というメソッドが生成されます。
getA()
を実行すると、どちらのフィールドの値が取得されるのでしょうか?
結果は以下の通りです。
/** 最初が小文字のフィールド */
@Getter
public class OneCharacter {
private String a = "a";
private String A = "A";
public void print() {
System.out.println(getA()); //⇒"a"
}
}
/** 最初が大文字のフィールド */
@Getter
public class OneCharacter {
private String A = "A";
private String a = "a";
public void print() {
System.out.println(getA()); //⇒"A"
}
}
フィールドA
とメソッドgetA()
が定義されている場合
クラス内で定義されたgetterと、lombokで生成されたgetterが同じ名前の場合、どちらが呼ばれるのでしょうか?
結果は以下の通りです。
@Getter
public class OneCharacter {
public String getA() { return "getA()";}
private String A = "A";
public void print() {
System.out.println(getA()); //⇒"getA()"
}
}
@Getter
public class OneCharacter {
private String A = "A";
public String getA() { return "getA()";}
public void print() {
System.out.println(getA()); //⇒"getA()"
}
}
宣言の順番に関係なく、クラス内で定義されたgetterが呼ばれました。
まとめ
- lombokで生成されたgetterより、クラス内で定義されたgetterが優先される
- lombokで生成されたgetterが重複する場合、最初に宣言されたフィールドに対応するgetterが優先される
追記
@inabajunmr からコメントをいただきました。
上記の現象は、lombok @Getter and @Setterに書いてありました。
You can annotate any field with @Getter and/or @Setter, to let lombok generate the default getter/setter automatically.
A default getter simply returns the field, and is named getFoo if the field is called foo (or isFoo if the field's type is boolean). A default setter is named setFoo if the field is called foo, returns void, and takes 1 parameter of the same type as the field. It simply sets the field to this value.