2010-10-11 20 views
1

的Java bean 格式JDK 1.5的問題 - 布爾屬性的getter方法被調用不正確

public class Format extends HibernateBean implements Serializable { 

    private static final Logger log = Logger.getLogger(Format.class); 
    private Long id; 
    private boolean isQualifyFormat; 

    ...other fields 

    public Long getId() { 
    return id; 
    } 

    public void setId(Long id) { 
    this.id = id; 
    } 

    **//static method, it's exposed to a HttpServlet** 
    public static Format getQualifyFormat() throws HibernateException {   
    log.debug("getQualifyFormat"); 
    ... 
    } 

    /** 
    * @hibernate.property column="df_isqualifyinglistformat" type="boolean" 
    * @return boolean 
    */ 
    public boolean isQualifyFormat() { 
    log.debug ("isQualifyFormat"); 
    return isQualifyingListFormat; 
    } 

    public void setQualifyFormat(boolean qualifyFormat) { 
     isQualifyingListFormat = qualifyingListFormat; 
    } 
    ... 

} 

Hibernate映射文件,Format.hbm.xml

<hibernate-mapping> 
<class 
    name="Format" 
    table="dbo.mc_distribution_format" 
    schema="data"  
    > 

    <id 
     name="id" 
     column="df_formatid" 
     type="java.lang.Long" 
    > 
     <generator class="native"></generator> 
    </id>  
    <property 
     name="qualifyFormat" 
     type="boolean" 
     update="true" 
     insert="true" 
     column="df_isqualifyformat" 
    /> 

在理論上,方法isQualifyFormat的bean格式應該在Hibernate的persistense進程中調用bean格式。據我所知,布爾屬性的獲取方式可以是is-get-。方法is-具有優先級,如果兩者在bean中都可用。

,它運作良好,在大多數情況下,除非情況: 如果有任何實際的代碼指的是靜態方法,Format.getQualifyFormat,在同一個jar包。上面的getQualifyFormat方法是以某種方式調用的,即使它是靜態的,並且已經有了is-

發生這種情況時,我將我的代碼升級到JDK 1.5。它在JDK 1.4中很好。 我想這可能是由於JDK 1.5中的反射改進問題引起的,jdk/jre是否會解析代碼並在編譯時發現靜態方法getQualifyFormat的引用,然後將其緩存爲屬性qualifyFormat的默認getter?

任何想法?

+3

你的代碼看起來不一致,而且很混亂。 'isQualifyFormat'是方法和字段的名稱。此外,該方法正在返回其他的東西。此外,該領域的制定者還設置了其他一些變量。 – 2010-10-11 10:27:43

+0

混淆,是的,一致同意!但是,語法是好的,對吧?字段isQualifyFormat具有setter方法setQualifyFormat和getter方法isQualifyFormat。這也是我的問題,爲什麼靜態方法getQualifyFormat導致我提到的混亂。我需要關於屬性方法在我的混亂情況下如何工作的參考。 – 2010-10-11 14:25:17

回答

3

如果您希望事情正常工作,您必須使用適當的約定。

如果字段名稱是xyz

  • 存取( 「吸氣劑」)被稱爲getXyz()(它 可以並且應該也可以稱爲 isXyz()當且僅當xyz的類型是 boolean的)
  • 的突變(「setter」)被稱爲 setXyz()並且必須返回無效

如果你不遵守這些約定,那麼Java bean方法將不起作用,並且幾乎所有框架都會使用這些方法。

另外,在isXyz()方法旁邊有一個靜態的getXyz()方法是要求麻煩的,至少可以說。我不知道它是否有效,但它非常混亂。

我個人認爲,具有bean屬性的類不應該有任何其他方法,如果它們不是getter或setter來使方法意圖更清晰,則不應該有任何其他名爲get *,set *或is *的方法。

+0

謝謝!我同意你的建議。但是,關鍵是,我需要弄清楚我的情況是如何出現問題的。我的領域是QualifyFormat具有setter方法setQualifyFormat和getter方法isQualifyFormat。當有任何代碼引用靜態方法Format.getQualifyFormat時,爲什麼它會碰到靜態方法getQualifyFormat而不是isQualifyFormat? – 2010-10-11 14:30:55

+0

我的猜測是,hibernate首先查找get *()方法,並且僅使用*()方法作爲後備。我不確定他們檢查非靜態方法(我甚至不確定這個bean規範要求方法是非靜態的,儘管它們應該是)。所以:保持安全,避免誤解。 – 2010-10-11 14:40:46

+0

重要嗎?正如所指出的,你的代碼不遵循Java Beans規範。 *編輯*這是關於OP而不是seanizer。 – SteveD 2010-10-11 14:42:07