2010-10-11 22 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