2010-01-13 14 views
8

Soy nuevo en Java, y me gustaría crear algunas variables de clase que se calculan dinámicamente cuando se accede, como se puede hacer en Python utilizando el método property(). Sin embargo, no estoy seguro de cómo describir esto, por lo que Google me muestra mucho sobre la clase de Java "Propiedad", pero esto no parece ser lo mismo. ¿Cuál es el equivalente Java de la propiedad de Python()?¿Cuál es la propiedad de Java Equivalent of Python()?

+0

Gracias por las respuestas. Solo para aclarar, sé que Java generalmente lo alienta a acceder a los miembros a través de getters y setters. Mi pregunta era si Java le permite acceder a un miembro (por ejemplo, obj.member), y llama al getter/setter detrás de las escenas, por lo que hacer x = obj.member realmente haría x = obj.getMember(). – Cerin

Respuesta

7

No hay tal recurso incorporado en el lenguaje Java. Tienes que escribir todos los getters y setters explícitamente por ti mismo. IDEs como Eclipse puede generar este código repetitivo para usted.

Por ejemplo:

class Point{ 
    private int x, y; 

    public Point(int x, int y){ 
    this.x = x; 
    this.y = y; 
    } 

    public void setX(int x){ 
    this.x = x; 
    } 

    public int getX(){ 
    return x; 
    } 

    public void setY(int y){ 
    this.y = y; 
    } 

    public int getY(){ 
    return y; 
    } 
} 

Es posible que desee echar un vistazo a Project Lombok que proporciona las anotaciones @Getter y @Setter que son algo similar a Python de property.

Con Lombok, el ejemplo anterior se reduce a:

class Point{ 
    @Getter @Setter private int x, y; 

    public Point(int x, int y){ 
    this.x = x; 
    this.y = y; 
    } 
} 
+0

Esto está más cerca pero aún no permite que los métodos dinámicos invoquen cuando una propiedad (que se usa como un atributo) cambia. Aquí hay un código python que ajusta muchos otros atributos de objeto. Compre simplemente 'configurando' el uri: https://bitbucket.org/russellballestrini/miniuri/src/tip/miniuri.py –

+1

Puede deshacerse de la definición del constructor que se muestra arriba. usando @AllArgsConstructor. – Nik

0

¿Desea crear nuevos campos/getters/setters en la clase? Si desea hacer esto en tiempo de ejecución, debe crear una clase completamente nueva con sus campos y métodos, y cargarla en la JVM. Para crear una nueva clase, puedes usar una biblioteca como ASM o CGLib, pero si eres nuevo en Java, no es algo con lo que quieras comenzar.

2

Ellos no existen realmente. En Java, es una práctica común declarar miembros como private o protected y solo permitir el acceso a ellos a través de métodos. A menudo, esto lleva a muchos métodos pequeños getFoo() y setFoo(newFoo). Python realmente no tiene private y protected y es más común permitir el acceso directo a los miembros.

1

Como han notado otros, Java tiene getters y setters, pero no hay un análogo estricto. Hay una biblioteca de terceros llamada Project Lombok que utiliza una anotación para generar los getters y los setters en los archivos .class a la hora de comile. Esto podría usarse para hacer las cosas un poco menos detalladas.

+3

-1, cuando no tiene nada nuevo que agregar, debe devolver las respuestas ya existentes. –

+0

Mi adición señalaba el Proyecto Lombok. GreyMatter 9.0 luego editó su respuesta para incluirla. –

+0

No hagas acusaciones tontas. El tiempo de edición de mi respuesta (13:18) es anterior al tiempo de publicación de tu respuesta (13:33). – missingfaktor

-1

En realidad, puede simular este comportamiento en Java.

ADVERTENCIA: solución fea continuación

Puede escribir un método en una clase de utilidad como el código de abajo:

public Object getProperty(String property, Object obj) { 
    if (obj != null && property != null) { 
     Field field = obj.getClass().getDeclaredField(property); 
     field.setAccessible(true); 
     try { 
      return field.get(obj); 
     } catch (Exception ex) { 
      return null; 
     } 
    } 
    return null; 
} 

en realidad se puede declarar como un método estático y luego simplemente importar este método en sus clases que necesitará este comportamiento.

Por cierto, Groovy admite esta característica.

+0

Por favor, lea mi publicación más de cerca. No estaba buscando una función para acceder a los miembros de la instancia. Estaba buscando una función que llama a una función cuando hago referencia a un miembro de instancia. p. myobj.attribute = 123; realmente lo haría: myobj.setAttribute (123); – Cerin

3

la función incorporada de propiedad() hace exactamente lo contrario de lo que se describe aquí en las respuestas. no se trata de generar getters y setters para variables miembro. solo le permite llamar a un método accediendo a una propiedad (entonces, aunque acceda a una variable en la clase Python, se llamará a una función). (this post explica cómo y por qué usarlo)
dicho esto, Java no ofrece algo como esto. aún más, se desaconseja el acceso a la propiedad en Java. Supongo que puedes hacerlo en el lenguaje de script Groovy y en el meta mágico.pero no sé de mi cabeza cómo hacer esto.

Cuestiones relacionadas