5

Droolsplannerを使用したアプリケーションを作成しています。

@ValueRangeFromSolutionProperty、別のクラス(NQueensこの場合)のプロパティを参照することになっています。@ValueRangeFromSolutionPropertyのJavaDocsから:

propertyName

    The property name of which exists a getter on the Solution that returns a Collection. 

しかし、私は矛盾に気づきました:アノテーターはrowListからのプロパティを使用しますNQueens。ただし、rowList(とは対照的にRowList)はプライベート変数です(以下のスニペットを参照)。イントロスペクション(getterメソッドとsetterメソッドから)によってプロパティを推測することになっている場合は、次のRowListように綴る必要がありgetRowList()ますか?

質問: Javaは、getterメソッドからプロパティ名(caseおよびall)をどのように推測(イントロスペクト)しますか?

または@ValueRangeFromSolutionProperty、プライベート変数に直接アクセスしますか?


背景の詳細​​:From Queen.java、チェス盤の女王を表すクラス:

public class Queen extends AbstractPersistable {
....
@ValueRangeFromSolutionProperty(propertyName = "rowList")
public Row getRow() {
    return row;
....

From 、からプロパティを取得する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;
...
4

3 に答える 3

16

JavaBeans仕様では、プロパティpropertyNameにはgetterメソッドgetPropertyName()やsetterメソッド、あるいはその両方が必要であると規定されていますsetPropertyName()

プロパティは、getterメソッドとsetterメソッドの存在によってのみ定義され、計算値にすることもできます。オブジェクトのインスタンス変数は必要ありません。

この仕様では、プロパティとゲッター/セッターメソッドの大文字と小文字の規則を定義しています。

したがって、既存の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. namenullの場合は、そのように返します
  2. nameの最初の2文字が大文字の場合は、そのように返します
  3. 他のすべての文字列は、最初の文字を大文字から外します
于 2012-01-23T09:35:21.143 に答える
3

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

詳細情報を含む関連質問

于 2012-01-23T09:07:01.090 に答える
0

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

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

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

于 2012-01-23T09:07:56.457 に答える