ゲッターとセッターに関して、JavaBean プロパティの命名について混乱している
-
12-11-2019 - |
質問
Drools plannerを使用したアプリケーションを作成しています。
の @ValueRangeFromSolutionProperty
別のクラスのプロパティを参照することになっています (NQueens
この場合)。から @ValueRangeFromSolutionProperty の JavaDocs:
propertyName
The property name of which exists a getter on the Solution that returns a Collection.
しかし、私はあることに気づきました 矛盾:アノテーターはプロパティを使用します rowList
から NQueens
. 。しかし rowList
(とは対照的に RowList
) はプライベート変数です (以下のスニペットを参照)。本来なら 内省によって性質を推測する (ゲッターメソッドとセッターメソッドから)綴るべきではありませんか RowList
のように getRowList()
?
質問: Java はどのようにして getter メソッドからプロパティ名 (大文字と小文字) を推論 (イントロスペクト) するのでしょうか?
それとも、 @ValueRangeFromSolutionProperty
プライベート変数にアクセスする 直接?
背景の詳細:から Queen.java
, 、チェス盤上のクイーンを表すクラス:
public class Queen extends AbstractPersistable {
....
@ValueRangeFromSolutionProperty(propertyName = "rowList")
public Row getRow() {
return row;
....
から NQueens.java
, 、元のクラス @ValueRangeFromSolutionProperty
プロパティを次から取得します。
public class NQueens extends AbstractPersistable implements Solution<SimpleScore> {
...
private List<Column> columnList;
private List<Row> rowList;
....
public List<Row> getRowList() {
return rowList;
...
解決
の JavaBeansの仕様 不動産に対してそう言う propertyName
getterメソッドがあるはずです getPropertyName()
および/またはセッターメソッド setPropertyName()
.
プロパティは、ゲッター メソッドとセッター メソッドの存在のみによって定義され、計算値にすることもできます。オブジェクトのインスタンス変数は必要ありません。
この仕様では、プロパティとゲッター/セッター メソッドの大文字化ルールが定義されています。
したがって、既存のJava名の中央からプロパティまたはイベント名を抽出するとき、通常、最初の文字を小文字に変換します。ただし、すべてのアッパーケース名の使用をサポートするために、名前の最初の2文字が両方の上級であるかどうかを確認し、そのままにしておきます。たとえば、
「FooBah」は「fooBah」に、「Z」は「z」に、「URL」は「URL」に
このメソッドは実際には次のように実装されます。
/*
Utility method to take a string and convert it to normal Java variable name
capitalization. This normally means converting the first character from upper case to
lower case, but in the (unusual) special case when there is more than one character
and both the first and second characters are upper case, we leave it alone.
Thus "FooBah" becomes "fooBah" and "X" becomes "x", but "URL" stays as "URL".
Parameters:
name The string to be decapitalized.
Returns:
The decapitalized version of the string.
*/
public static String decapitalize(String name) {
if (name == null || name.length() == 0) {
return name;
}
if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
Character.isUpperCase(name.charAt(0))){
return name;
}
char chars[] = name.toCharArray();
chars[0] = Character.toLowerCase(chars[0]);
return new String(chars);
}
それで:
- もし
name
null である場合は、そのまま返します - もし
name
最初の 2 文字が大文字である場合は、そのまま返します - 他のすべての文字列は最初の文字を大文字にしないでください
他のヒント
これは JavaBeans 命名規則によって定義されます。ゲッター名には、「get」の後にプロパティ名の最初の文字が大文字で続きます。
Javabeans が「プロパティ」を参照する場合、それは get() メソッドと set() メソッドを備えたものです。データの内部ストレージが何であるかは関係ありません (存在する場合)。
したがって、プロパティ「foo」にはアクセス メソッド getFoo() および setFoo() がありますが、これらのメソッドの動作はプロパティの定義とは無関係です。
http://docs.oracle.com/javase/tutorial/javabeans/writing/properties.html