2

这个方法签名有效吗?

public Boolean isBikeTyreFlat(){}

请注意,我试图在这里返回一个 Object 而不是原语。

谢谢 :)

4

3 回答 3

10

在 JavaBeans 中,getter 方法boolean可以是getXXX()isXXX()。由于Boolean不是原始类型,因此 agetXXX()是必需的。isXXX()仅适用于布尔原始类型(感谢@Kemoda)。

请参阅JavaBeans 规范的第 8.3.2 节

于 2012-04-17T09:39:02.877 回答
1

在严格的 JavaBeans 中,这是一个有效的名称(参见@TheEliteGentleman 的答案)。

但是,请确保您没有做这样的事情:

public class BikeTyre {
    private boolean flat;
    public Boolean isBikeTyreFlat() {
        return flat;
    }
}

不建议这样做,因为您的字段名称与方法名称不匹配。一些框架允许向 Java Bean 的内部字段和 getter/setter 添加注解;不匹配可能会混淆这些框架。另请注意,将类名添加到您的字段是不好的做法;你的方法应该只是isFlat().

当然,这是完全有效的:

public class Unicycle {
    private boolean bikeTyreFlat;
    public Boolean isBikeTyreFlat() {
        return bikeTyreFlat;
    }
}

但话又说回来,你真的在​​为独轮车建模吗?;-)

于 2012-04-17T10:14:17.560 回答
1

我不得不不同意这个答案。我有同样的问题并写了一个快速测试。

给定 JavaBean 为:

package example;

public class FooBean {

    private Boolean published;

    public void setPublished(Boolean published) {
        this.published = published;
    }

    public Boolean isPublished() {
        return published;
    }

}

和一个看起来像这样的 Main 类:

package example;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {



        BeanInfo beanInfo = null;
        try {
            beanInfo = Introspector.getBeanInfo(FooBean.class);
        } catch (IntrospectionException e) {
            e.printStackTrace();
        }
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

        for(PropertyDescriptor descriptor : propertyDescriptors){
            System.out.println("descriptor: " + descriptor);
            System.out.println("descriptor.getName(): " + descriptor.getName());
            System.out.println("descriptor.getReadMethod(): " + descriptor.getReadMethod());
        }

    }

}

运行主类的结果是:

descriptor: java.beans.PropertyDescriptor@1e746992
descriptor.getName(): class
descriptor.getReadMethod(): public final native java.lang.Class java.lang.Object.getClass()
descriptor: java.beans.PropertyDescriptor@c994fbad
descriptor.getName(): published
descriptor.getReadMethod(): null

如果我变成FooBean.java这样:

package example;

public class FooBean {

    private boolean published;

    public void setPublished(boolean published) {
        this.published = published;
    }

    public boolean isPublished() {
        return published;
    }

}

然后得到的输出是:

descriptor: java.beans.PropertyDescriptor@18072768
descriptor.getName(): class
descriptor.getReadMethod(): public final native java.lang.Class java.lang.Object.getClass()
descriptor: java.beans.PropertyDescriptor@1e2ff4ad
descriptor.getName(): published
descriptor.getReadMethod(): public boolean example.FooBean.isPublished()

这告诉我,要使其成为有效的 JavaBeans 签名,必须将类型声明为原始布尔值。

编辑 经过进一步测试,似乎只有声明的 isXxx() 方法的返回类型必须是布尔值,JavaBeans 才能识别它:

package example;

public class FooBean {

    private Boolean published;

    public void setPublished(Boolean published) {
        this.published = published;
    }

    public boolean isPublished() {
        return published;
    }

}

结果:

descriptor: java.beans.PropertyDescriptor@1e746992
descriptor.getName(): class
descriptor.getReadMethod(): public final native java.lang.Class java.lang.Object.getClass()
descriptor: java.beans.PropertyDescriptor@f96377e5
descriptor.getName(): published
descriptor.getReadMethod(): public boolean example.FooBean.isPublished()
于 2012-11-28T18:01:15.470 回答