Pregunta

Por eso, voluntariamente me he mantenido con un Java n00b hasta hace poco, y mi primera exposición real me provocó un pequeño shock:¡Java no tiene propiedades de estilo C#!

Ok, puedo vivir con eso.Sin embargo, también puedo jurar que he visto código de obtención/definición de propiedades en Java en una base de código, pero no recuerdo dónde.¿Cómo se logró eso?¿Existe una extensión de idioma para eso?¿Está relacionado con NetBeans o algo así?

¿Fue útil?

Solución

Existe un patrón "estándar" para captadores y definidores en Java, llamado Propiedades del frijol.Básicamente cualquier método que comience con get, que no toma argumentos y devuelve un valor, es un captador de propiedad para una propiedad nombrada como el resto del nombre del método (con una letra inicial en minúscula).Asimismo set crea un definidor de un método nulo 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 si se los solicita (en Eclipse es tan simple como mover el cursor a un campo y presionar Ctrl-1, luego seleccionar la opción de la lista).

Por lo que vale, para facilitar la lectura, puedes usar is y has en lugar de get también para propiedades de tipo booleano, como en:

public boolean isAwesome();

public boolean hasAwesomeStuff();

Otros consejos

Me sorprende que nadie haya mencionado proyecto lombok

Sí, actualmente no hay propiedades en java.También faltan algunas otras características.
Pero por suerte tenemos proyecto lombok que está intentando mejorar la situación.También es cada día más popular.

Entonces, si estás usando lombok:

@Getter @Setter int awesomeInteger = 5;

Este código va a generar getAwesomeInteger y setAwesomeInteger también.Entonces es bastante similar a Propiedades implementadas automáticamente de C#.

Puede obtener más información sobre los captadores y definidores de lombok. aquí.
Definitivamente deberías echarle un vistazo otras características también.Mis favoritos son:

Lombok está bien integrado con IDE, por lo que mostrará los métodos generados como si existieran (sugerencias, contenidos de clases, declaración de ir a y refactorización).
El único problema con lombok es que es posible que otros programadores no lo sepan.Tu siempre puedes delombok el código, pero eso es más una solución alternativa que una solución.

Se propuso "Soporte de propiedad Java" para Java 7, pero no llegó al lenguaje.

Ver http://tech.puredanger.com/java7#property para obtener más enlaces e información, si está interesado.

La convención de beans 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 lenguajes de la JVM, por ejemplo, Groovy, obtienes propiedades reemplazables similares a C#, por ejemplo,

int foo

al que se accede con un simple .foo y aprovecha el incumplimiento getFoo y setFoo implementaciones 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 las propiedades de C#.Es http://projectlombok.org/

Es posible que no necesite los prefijos "get" y "set", para que se parezca más a propiedades, puede hacerlo así:

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

La mayoría de los IDE para Java generarán automáticamente códigos getter y setter si así lo desea.Hay varias convenciones diferentes y un IDE como Eclipse le permitirá elegir cuál desea utilizar e incluso definir el suyo propio.

Eclipse incluso incluye refactorización automatizada que le permitirá envolver una propiedad en un captador y definidor y modificará todo el código que accede a la propiedad directamente, para que utilice el captador y/o definidor.

Por supuesto, Eclipse solo puede modificar el código que conoce; cualquier dependencia externa que tenga podría romperse con dicha refactorización.

De Jeffrey Richter libro CLR a través de C#:(Creo que estas podrían ser las razones por las que todavía no se agregan propiedades en JAVA)

  • Un método de propiedad puede generar una excepción;El acceso al campo nunca arroja una excepción.
  • Una propiedad no puede pasarse como out o ref parámetro a un método;un campo puede.
  • Un método de propiedad puede tardar mucho en ejecutarse;El acceso al campo siempre se completa de inmediato.Una razón común para usar propiedades es realizar la sincronización de subprocesos, lo que puede detener el hilo para siempre y, por lo tanto, no se debe usar una propiedad si se requiere 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 deSystem.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 deMarshalByRefObject nunca debe utilizar 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.El System.DateTime la clase tiene un solo lecturaNow propiedad que devuelve la fecha y hora actuales.Cada vez que consulte esta propiedad, devolverá un valor diferente.Este es un error, y Microsoft desea que puedan arreglar la clase haciendo ahora un método en lugar de una propiedad. Environment'sTickCount La propiedad 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 cualquier orden que elija sin notar ningún comportamiento diferente en el tipo.
  • Un método de propiedad puede requerir memoria adicional o devolver una referencia a algo que en realidad no es parte del estado del objeto, por lo que modificar el objeto devuelto no tiene ningún efecto en el objeto original;La consulta de un campo siempre devuelve una referencia a un objeto que se garantiza que es 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 con frecuencia no está documentada.

Mi experiencia con Java tampoco es tan alta, así 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
}

Si está utilizando eclipse, entonces tiene la capacidad de generar automáticamente el método getter y setter para los atributos internos, puede ser una herramienta útil y que le ahorrará tiempo.

Recién estoy lanzando anotaciones de Java 5/6 y un procesador de anotaciones para ayudar con esto.

Verificar http://code.google.com/p/javadude/wiki/Annotations

La documentación es un poco ligera en este momento, pero la referencia rápida debería transmitir la idea.

Básicamente, genera una superclase con getters/setters (y muchas otras opciones de generación de código).

Una clase de muestra podría verse así

@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íame un correo electrónico si lo pruebas y lo encuentras útil!- Scott

No hay una palabra clave de propiedad en Java (como la que puede encontrar en C#). La forma más cercana de tener un captador/definidor de 1 palabra es hacer lo mismo 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 automáticamente.

También puedes hacerlo usando NetBeans.

Para crear métodos de acceso para su clase, abra un archivo de clase, luego haga clic derecho en cualquier lugar del editor de código fuente y elija el comando de menú Refactorizar, Encapsular campos.Se abre un cuadro de diálogo.Haga clic en Seleccionar todo, luego haga clic en Refactorizar.Voilá,

Buena suerte,

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top