2009-07-13 28 views
15

Si una clase contiene una variable llamada "blah", entonces la sintaxis getter/setter estándar es obviamente getBlah() y setBlah(). Pero si tengo una clase POJO con una variable llamada isBlah, ¿usaría:¿Cuál es la sintaxis correcta para "variable" getter/setters en una clase POJO?

public type getIsBlah() { 
    return isBlah; 
} 

public setIsBlah(type isBlah) { 
    this.isBlah = isBlah; 
} 

¿O sería esto?

public type isBlah() { 
    return isBlah; 
} 

public setBlah(type blah) { 
    this.isBlah = blah; 
} 

La primera parece ajustarse más estrictamente a las convenciones POJO, pero el segundo tipo es el que genera IntelliJ si pregunto a hacer una clase getter/setters (y bueno, IntelliJ nunca me ha defraudado todavía :]). Entonces, ¿cuál es la sintaxis preferida?

Respuesta

20

Una razón para usar propiedades es desacoplar la API de la implementación. En otras palabras, no debe sentirse obligado por lo que se llama su variable privada. Eso no debería informar el nombramiento más allá de tratar de mantenerlo legible para los mantenedores de código.

Yo diría que si "tipo" es boolean en este caso, entonces la segunda forma es correcta. Si es noboolean, debe usar getXXX - pero probablemente no use getIsXXX. Para mí, "es" tiene una correspondencia muy fuerte con las propiedades booleanas, y su uso en otros contextos no solo rompería las convenciones de JavaBeans (lo que podría afectar a otras herramientas) sino que podría confundir a la OMI.

+3

+1 para romper las convenciones de JavaBeans –

+5

@Vincent: Supongo que quiere decir "+1 por mencionar que rompería las convenciones de JavaBeans" - en lugar de "+1 - ¡ser un innovador de la convención!" :) –

3

No diría que hay una convención fuerte para POJO, pero para el JavaBeans el segundo ejemplo (IntelliJ) es el estándar para atributos booleanos, todo lo demás usa getX.

2

También elegiría su segunda opción. El primero, con getIsBlah(), parece prolijo y redundante.

1

Tanto el "get" como el "is" están bien en realidad, ya que técnicamente siguen siendo aceptables según la convención JavaBeans. Buscaría lo que suene mejor o más natural, dependiendo de qué palabra es realmente tu "Blah".

3

Hay un gran problema con la sintaxis "is" si usa JSTL, que es que JSTL EL no los reconoce. Es bastante estúpido, pero los diseñadores de JSTL EL no se molestaron en verificar su lógica para el cumplimiento de javabeans.

A menudo me encuentro escribiendo métodos getIsBlah() en mis clases view-layer, que llaman isBlah(), solo para darle un gancho a JSTL. Es horrible.

+1

¿Este problema aún persiste con el último JSTL? –

+0

Creo que sí, aunque es más un problema con JSP EL que con JSTL. – skaffman

+0

Estoy bastante seguro de que ya no es el caso. – harmanjd

4

Tenga en cuenta que el nombre del campo es completamente irrelevante para el JavaBean specification. Solo los nombres de getter/setter son relevantes.

Normalmente, el nombre del comprador es get<PropertyName>(). Solo para boolean propiedades está permitido is<PropertyName>() como alternativa.

Tenga en cuenta que en su ejemplo el nombre de la propiedad Bean es "bla bla" cuando se llama al captador isBlah() y es "IsBlah" cuando llama a un captador getIsBlah().

Personalmente prefiero isBlah().

0

JSTL solo permite isMyBool si es un booleano, no un booleano o cualquier otro objeto, según las especificaciones del bean. (primitivo vs objeto).

0

Lo que significa que JAXB genera código incorrecto. Crea propiedades Boolean, porque necesitan ser anulables, pero todavía nombra sus getters isXXX(), que viola la especificación Bean.

Cuestiones relacionadas