2012-08-31 51 views
1

我不熟悉java beans框架,在下面的場景中,我得到了方法getFooWithX的IndexedPropertyDescriptor,有人可以解釋爲什麼嗎?爲什麼javabeans框架爲NON索引方法創建IndexedPropertyDescriptor

public class IntrospectorTest { 
public static void main(String[] args) throws IntrospectionException { 
    BeanInfo info = Introspector.getBeanInfo(SubClass.class); 
    PropertyDescriptor[] descriptors = info.getPropertyDescriptors(); 
    for (int i = 0; i < descriptors.length; i++) { 
     System.out.println(descriptors[i].getClass().getName() + ":" + descriptors[i].getName()); 
    } 
} 

}

abstract class BaseClass { 
public abstract Object getFoo(); 

}

abstract class SubClass extends BaseClass { 
public Object getFooWithX(int x) { 
    return null; 
} 

}

和結果將是:

java.beans.PropertyDescriptor:class 
java.beans.PropertyDescriptor:foo 
java.beans.IndexedPropertyDescriptor:fooWithX 

爲什麼?

回答

1

如果一個方法被命名爲getX而沒有參數,它將被視爲一個非索引屬性X的getter。如果一個方法被命名爲帶有一個int參數的getX,它將被視爲一個getter索引屬性X.這就是爲什麼你返回IndexedPropertyDescriptor。

索引屬性是一個屬性,它是一個由整數索引的數組。例如,如果用戶可以有多個暱稱,並且public String getNickNames(int n)返回他們的* n * th暱稱,那麼「nickNames」是索引屬性。應該也有public String[] getNickNames()一次返回所有nickname,但是Introspector仍然會標識一個索引屬性,即使沒有這種方法存在。

這是否合適取決於語義上「getFooWithX」的含義。如果「fooWithX」是一個數組,並且該參數是一個用於選擇元素的索引,則這在語義上是有意義的。如果該參數不是數組中的索引,則最好將該方法重命名爲不能以「get」開頭(如果可能的話)。

相關問題