2012-04-17 5 views
1

Является ли эта подпись метода действительной?Является ли общедоступным Boolean isBikeTyreFlat() действительной сигнатурой метода JavaBeans?

public Boolean isBikeTyreFlat(){} 

Обратите внимание, что я пытаюсь вернуть объект, а не примитив.

Благодаря :)

+0

Почему не пытайтесь это сделать в своем коде. – RanRag

+0

Очень важен. –

+0

Извините ... Я знаю, что это сработает, но действительно ли оно соответствует стандартам именования javabean? – Continuity8

ответ

7

В JavaBeans, метод геттер для boolean может быть getXXX() или isXXX(). Поскольку Boolean не является примитивным типом, требуется getXXX(). isXXX() предназначен только для булевого примитивного типа (спасибо @Kemoda).

См. section 8.3.2 of the JavaBeans Specification.

+0

за свойствоdescriptor spec isXXX работает только для примитивного логического – Kemoda

+0

@Kemoda, должен был создать тестовый пример, и вы правы. Я обновил свой вопрос. –

+0

Да, я знаю это, потому что он укусил меня в последнее время, я был вынужден реорганизовать все мои булевы getters в форму «получить» в некоторых слоях моих приложений. – Kemoda

1

В строгом JavaBeans это действительное имя (см. Ответ @ TheEliteGentleman).

Однако, пожалуйста, убедитесь, что вы не делаете что-то вроде этого:

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

Это не рекомендуется, так как имя вашего поля не совпадает с именем метода. Некоторые фреймворки позволяют добавлять аннотации как к внутреннему полю, так и к getter/setter Java Bean; несоответствие может смутить эти рамки. Также обратите внимание, что неправильная практика заключается в добавлении имени класса в ваше поле; ваш метод должен быть только isFlat().

Конечно, это вполне допустимо:

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

Но опять же, вы на самом деле моделирования unicycles? ;-)

1

Я должен не согласен с this answer. У меня был такой же вопрос, и я написал быстрый тест.

Учитывая JavaBean как:

package example; 

public class FooBean { 

    private Boolean published; 

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

    public Boolean isPublished() { 
     return published; 
    } 

} 

и главный класс, который выглядит следующим образом:

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: [email protected] 
descriptor.getName(): class 
descriptor.getReadMethod(): public final native java.lang.Class java.lang.Object.getClass() 
descriptor: [email protected] 
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: [email protected] 
descriptor.getName(): class 
descriptor.getReadMethod(): public final native java.lang.Class java.lang.Object.getClass() 
descriptor: [email protected] 
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: [email protected] 
descriptor.getName(): class 
descriptor.getReadMethod(): public final native java.lang.Class java.lang.Object.getClass() 
descriptor: [email protected] 
descriptor.getName(): published 
descriptor.getReadMethod(): public boolean example.FooBean.isPublished() 
+0

Ваш раздел 'Edit' противоречит самому первому утверждению, в котором говорится:« Я не согласен с принятым ответом ». :-) –

+0

@BuhakeSindi Я обновил его, чтобы ссылаться на фактический ответ, который я имел в виду :) – FGreg

Смежные вопросы