it-swarm-es.tech

(no) Propiedades en Java?

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í?

54
Ishmaeel

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();
62
Calum

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.

7
Cheekysoft

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.

6
Hank Gay
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/

6
dantuch

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());
    }
}
4
LEMUEL ADANE

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)

  • Un método de propiedad puede lanzar una excepción; El acceso al campo nunca lanza una excepción.
  • Una propiedad no se puede pasar como un parámetro out o ref a un método; un campo puede.
  • Un método de propiedad puede tardar mucho tiempo en ejecutarse; El acceso al campo siempre se completa de inmediato. Una razón común para usar las propiedades es realizar la sincronización de subprocesos, que puede detener el subproceso para siempre, y por lo tanto, una propiedad no debe usarse si se requiere la sincronización de subprocesos. En esa situación, se prefiere un método. Además, si se puede acceder a su clase de forma remota (por ejemplo, su clase se deriva de 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.
  • Si se llama varias veces seguidas, un método de propiedad puede devolver un valor diferente cada vez; un campo devuelve el mismo valor cada vez. La clase 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.
  • Un método de propiedad puede causar efectos secundarios observables; El acceso al campo nunca lo hace. En otras palabras, un usuario de un tipo debería poder establecer varias propiedades definidas por un tipo en el orden que elija sin darse cuenta de ningún comportamiento diferente en el tipo.
  • Un método de propiedad puede requerir memoria adicional o devolver una referencia a algo que no es realmente parte del estado del objeto, por lo que la modificación del objeto devuelto no tiene efecto en el objeto original; la consulta de un campo siempre devuelve una referencia a un objeto que se garantiza que forma parte del estado del objeto original. Trabajar con una propiedad que devuelve una copia puede ser muy confuso para los desarrolladores, y esta característica a menudo no está documentada.
3
th1rdey3

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.

3
Bill Michell

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
}
2
Mark Embling

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

1
Scott Stanchfield

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.

1
TK.

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
1
Patrick PIGNOL

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,

0
levteck