Por lo tanto, me he mantenido voluntariamente un Java n00b hasta hace poco, y mi primera exposición real provocó un choque menor: ¡Java no tiene propiedades de estilo C #!
Ok, puedo vivir con eso. Sin embargo, también puedo jurar que he visto el código de obtención/establecimiento de propiedades en Java en una base de código, pero no puedo recordar dónde. ¿Cómo se logró eso? ¿Hay una extensión de lenguaje para eso? ¿Está relacionado con NetBeans o algo así?
Hay un patrón "estándar" para getters y setters en Java, llamado propiedades Bean . Básicamente, cualquier método que comience con get
, no tome argumentos y devuelva un valor, es un captador de propiedades para una propiedad denominada como el resto del nombre del método (con una letra de inicio en minúscula). Del mismo modo, set
crea un setter de un método void con un solo argumento.
Por ejemplo:
// Getter for "awesomeString"
public String getAwesomeString() {
return awesomeString;
}
// Setter for "awesomeString"
public void setAwesomeString( String awesomeString ) {
this.awesomeString = awesomeString;
}
La mayoría de los IDE de Java generarán estos métodos por usted si los pregunta (en Eclipse es tan simple como mover el cursor a un campo y presionar ctrl-1, luego seleccionar la opción de la lista).
Para lo que vale, para facilitar la lectura puede usar is
y has
en lugar de get
para las propiedades de tipo booleano también, como en:
public boolean isAwesome();
public boolean hasAwesomeStuff();
Me sorprende que nadie mencione proyecto lombok
Sí, actualmente no hay propiedades en Java. También hay otras características que faltan.
Pero afortunadamente tenemos proyecto lombok que está tratando de mejorar la situación. También se está volviendo más y más popular cada día.
Entonces, si estás usando lombok:
@Getter @Setter int awesomeInteger = 5;
Este código va a generar también getAwesomeInteger
y setAwesomeInteger
. Así que es bastante similar a propiedades auto-implementadas de C # .
Puede obtener más información sobre los captadores y configuradores de lombok aquí .
Definitivamente deberías revisar otras características también. Mis favoritos son:
Lombok está bien integrado con los IDE, por lo que mostrará métodos generados como si existieran (sugerencias, contenido de la clase, vaya a declaración y refactorización).
El único problema con lombok es que otros programadores pueden no saberlo. Siempre puede delombok el código, pero eso es más bien una solución que una solución.
Se propuso "Java Property Support" para Java 7, pero no llegó al lenguaje.
Consulte http://tech.puredanger.com/Java7#property para obtener más enlaces e información, si está interesado.
La convención del frijol es escribir código como este:
private int foo;
public int getFoo() {
return foo;
}
public void setFoo(int newFoo) {
foo = newFoo;
}
En algunos de los otros idiomas de la JVM, por ejemplo, Groovy, obtiene propiedades reemplazables similares a C #, por ejemplo,
int foo
al que se accede con un simple .foo
y aprovecha las implementaciones predeterminadas getFoo
y setFoo
que puede anular según sea necesario.
public class Animal {
@Getter @Setter private String name;
@Getter @Setter private String gender;
@Getter @Setter private String species;
}
Esto es algo así como propiedades C #. Es http://projectlombok.org/
Es posible que no necesite los prefijos "obtener" y "establecer", para que se parezcan más a las propiedades, puede hacerlo de esta manera:
public class Person {
private String firstName = "";
private Integer age = 0;
public String firstName() { return firstName; } // getter
public void firstName(String val) { firstName = val; } // setter
public Integer age() { return age; } // getter
public void age(Integer val) { age = val; } //setter
public static void main(String[] args) {
Person p = new Person();
//set
p.firstName("Lemuel");
p.age(40);
//get
System.out.println(String.format("I'm %s, %d yearsold",
p.firstName(),
p.age());
}
}
De Jeffrey Richter's libro CLR a través de C #: (Creo que estas pueden ser las razones por las que las propiedades aún no se agregan en Java)
out
o ref
a un método; un campo puede.System.MarshalByRefObject
), llamar al método de propiedad será muy lento y, por lo tanto, se prefiere un método a una propiedad. En mi opinión, las clases derivadas de MarshalByRefObject
nunca deben usar propiedades.System.DateTime
tiene una propiedad de solo lectura Now
que devuelve la fecha y hora actuales. Cada vez que consulta esta propiedad, devolverá un valor diferente. Esto es un error, y Microsoft desea que puedan arreglar la clase haciendo de Now un método en lugar de una propiedad. Environment
’s TickCount
property es otro ejemplo de este error.La mayoría de los IDE para Java generarán automáticamente el código de obtención y establecimiento si así lo desea. Hay una serie de convenciones diferentes, y un IDE como Eclipse le permitirá elegir la que desea usar, e incluso le permitirá definir la suya propia.
Eclipse incluso incluye refactorización automatizada que le permitirá envolver una propiedad en un getter y setter y modificará todo el código que accede directamente a la propiedad, para hacer que use el getter y/o setter.
Por supuesto, Eclipse solo puede modificar el código que conoce, cualquier dependencia externa que tenga podría ser interrumpida por tal refactorización.
Mi experiencia con Java tampoco es tan alta, por lo que cualquiera puede corregirme. Pero AFAIK, la convención general es escribir dos métodos así:
public string getMyString() {
// return it here
}
public void setMyString(string myString) {
// set it here
}
Acabo de lanzar las anotaciones de Java 5/6 y un procesador de anotaciones para ayudar a esto.
Echa un vistazo a http://code.google.com/p/javadude/wiki/Annotations
La documentación es un poco ligera en este momento, pero el quickref debería transmitir la idea.
Básicamente, genera una superclase con los captadores/definidores (y muchas otras opciones de generación de código).
Una muestra de clase podría verse como
@Bean(properties = {
@Property(name="name", bound=true),
@Property(name="age,type=int.class)
})
public class Person extends PersonGen {
}
Hay muchos más ejemplos disponibles y no hay dependencias de tiempo de ejecución en el código generado.
¡Envíeme un correo electrónico si lo prueba y lo encuentra útil! - Scott
Si está utilizando Eclipse, tiene la capacidad de generar automáticamente el método de obtención y configuración para los atributos internos, puede ser una herramienta útil y que ahorra tiempo.
No hay ninguna palabra clave de propiedad en Java (como podría encontrarlo en C #) la forma más cercana de tener 1 compilador/definidor de palabras es hacer como en C++:
public class MyClass
{
private int aMyAttribute;
public MyClass()
{
this.aMyAttribute = 0;
}
public void mMyAttribute(int pMyAttributeParameter)
{
this.aMyAttribute = pMyAttributeParameter;
}
public int mMyAttribute()
{
return this.aMyAttribute;
}
}
//usage :
int vIndex = 1;
MyClass vClass = new MyClass();
vClass.mMyAttribute(vIndex);
vIndex = 0;
vIndex = vClass.mMyAttribute();
// vIndex == 1
Como se mencionó anteriormente para Eclipse, el entorno de desarrollo integrado (IDE) a menudo puede crear métodos de acceso de forma automática.
También puedes hacerlo utilizando NetBeans.
Para crear métodos de acceso para su clase, abra un archivo de clase, luego haga clic con el botón derecho en cualquier lugar del editor de código fuente y elija el comando de menú Refactor, encapsular campos. Se abre un diálogo. Haga clic en Seleccionar todo, luego haga clic en Refactor. Voilà,
Buena suerte,