ゲッターとセッターに関して、JavaBean プロパティの命名について混乱している

StackOverflow https://stackoverflow.com/questions/8969112

  •  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);
 }

それで:

  1. もし name null である場合は、そのまま返します
  2. もし name 最初の 2 文字が大文字である場合は、そのまま返します
  3. 他のすべての文字列は最初の文字を大文字にしないでください

他のヒント

これは JavaBeans 命名規則によって定義されます。ゲッター名には、「get」の後にプロパティ名の最初の文字が大文字で続きます。

詳細情報を含む関連質問

Javabeans が「プロパティ」を参照する場合、それは get() メソッドと set() メソッドを備えたものです。データの内部ストレージが何であるかは関係ありません (存在する場合)。

したがって、プロパティ「foo」にはアクセス メソッド getFoo() および setFoo() がありますが、これらのメソッドの動作はプロパティの定義とは無関係です。

http://docs.oracle.com/javase/tutorial/javabeans/writing/properties.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top