2009-05-17 10 views
22

Soy nuevo en Java, pero tengo alguna experiencia OOP con ActionScript 3, así que estoy tratando de migrar confiando en cosas que sé.Getters/setters en Java

En ActionScript 3 puede crear getters y setters utilizando las palabras clave get y set, lo que significa que crea un método en la clase y accede a los datos a través de una propiedad de una instancia de esa clase. Puede parecer complicado, pero no lo es. He aquí un ejemplo:

class Dummy{ 

    private var _name:String; 

    public function Dummy(name:String=null){ 
     this._name = name; 
    } 

    //getter 
    public function get name():String{ 
     return _name; 
    } 

    //setter 
    public function set name(value:String):void{ 
    //do some validation if necessary 
     _name = value; 
    } 

} 

Y me gustaría acceder name en un objeto como:

var dummy:Dummy = new Dummy("fred"); 
trace(dummy.name);//prints: fred 
dummy.name = "lolo";//setter 
trace(dummy.name);//getter 

¿Cómo habría de hacerlo en Java?

Simplemente tener algunos campos públicos está fuera de la cuestión. Me he dado cuenta de que existe la convención de usar get y set en frente de los métodos, con lo que estoy de acuerdo.

Por ejemplo,

class Dummy{ 

    String _name; 

    public void Dummy(){} 

    public void Dummy(String name){ 
     _name = name; 
    } 

    public String getName(){ 
     return _name; 
    } 

    public void setName(String name){ 
     _name = name; 
    } 

} 

¿Existe un equivalente de ActionScript 3 getter/setters en Java, como en acceso a un campo privado como un campo de una instancia de la clase, pero tener un método para implementar eso internamente en la clase?

+13

Parece que está llegando a un punto muy sensible para los programadores de Java;) – bbmud

+0

Gracias a todos ustedes por la entrada. Me quedaré con las convenciones de Java al escribir el código de Java a partir de ahora :) En cuanto a los IDE que he probado Eclipse y NetBeans y me gustan los dos, no puedo decidirme. NetBeans tiene algunas buenas características de GUI (acaba de comprobar las muestras). Me limitaré a usar Terminal para empezar (para hacer jarras) y todo eso, al menos hasta que me ponga de pie. Opiniones de los principiantes sobre Java: yay: ¡MUCHO poder! Meh: ¿Debes hacer todo? Para entender algo grave, parece que necesitas escribir MUCHO código. –

Respuesta

20

Nope. Los getters y setters de AS3 son una cosa de ECMAScript. En Java, está atascado con las funciones de estilo getVal() y setVal(); no hay ningún azúcar sintáctico que le facilite las cosas.

Creo que Eclipse puede ayudar a ese tipo de cosas, aunque la generación automática ...

+2

Lo mismo ocurre con Netbeans con "Encapsulate Fields" – nxadm

+1

Lo mismo ocurre con Emacs/JDEE con M-x jde-gen-get-set-methods. – Glenn

+12

Sí - Su editor de elección probablemente pueda hacer lo mismo. Escuché que M-x M-butterfly puede incluso escribir el resto del programa :) – zenazn

2

En Java, la única opción que tiene, sin exponer los componentes internos de su objeto es hacer que sus propios captadores y definidores y cuando tenga en tu ejemplo.

La convención es anteponer get o set en frente del campo que se está modificando. Entonces, como en su ejemplo, el campo name tendría getName y setName métodos como su getter y setter correspondientes, respectivamente.

10

Su código de Java está bien, excepto que lo haría, desea hacer _nameprivado.

No hay obtener y conjunto palabras clave en Java como en su ejemplo de AS3. Lo siento, no es mejor que lo que ya estás haciendo.

código corregido:

class Dummy { 
    private String _name; 

    public void Dummy() {} 

    public void Dummy(String name) { 
    setName(name); 
    } 

    public String getName() { 
    return _name; 
    } 

    public void setName(String value) { 
    _name = value; 
    } 
} 
+0

Gracias por el enlace, me apegaré a las convenciones de Java al escribir Java. Y prometo llamar campos de propiedades cuando hablo de Java;) –

+0

@George Las propiedades y los campos son conceptos diferentes. Una propiedad puede o no almacenarse en un campo (el área de un círculo es una propiedad, y puede haber un método getArea, pero internamente se puede calcular a partir del radio). –

+0

@ Adam Pensé que las funciones de una clase se conocen como métodos (privado, público, etc.) y las variables de una clase se denominan propiedades/campos. No estoy 100% seguro de seguir tu ejemplo. ¿Estás diciendo que circle.area y circle.getArea() son ambas propiedades de una clase Circle? Gracias por señalar que las propiedades y los campos son diferentes. –

3

Lamentablemente, no, no es el apoyo a nivel de lenguaje equivalente en Java.

Los patrones get * y set * están tan establecidos en la cultura java que encontrará un soporte IDE fuerte para ellos (p. Ej., Eclipse los hará automáticamente), y si está trabajando en algo que utiliza el lenguaje de expresión primero creado para jsps (EL), entonces podrá usar la notación de propiedad para acceder a getters y setters.

3

Consideraría no tener el getter o setter ya que no hacen nada en su caso, excepto que el código sea más complicado. Aquí hay un ejemplo sin getters o setters.

class Dummy { 
    public String name; 
    public Dummy(String name) { this.name = name; } 
} 

Dummy dummy = new Dummy("fred"); 
System.out.println(dummy.name);//getter, prints: fred 
dummy.name = "lolo";//setter 
System.out.println(dummy.name);//getter, prints: lolo 

En mi humilde opinión No hagas las cosas más complicadas de lo necesario. Con demasiada frecuencia, la complejidad añadida sufrirá de You-Aint-Gonna-Need-It

+0

En mi humilde opinión, estás equivocado. La encapsulación sugiere que todos los campos deben ser privados, y los métodos getter y setter para acceder a los campos. Si escribe una aplicación compleja con su clase ficticia, y un día tiene que pensar que el nombre no puede estar vacío, la clase de George podría reescribirse con un cheque. Si tiene que hacer la misma modificación a su clase, tiene que privatizar el campo de nombre, escribir un getter y un setter (donde verificar que el nombre no pueda ser nulo) y MODIFICAR toda su aplicación cuando se refiera al campo . –

1

Además, antes de agregar arregladores y captadores, puede ser una buena idea preguntarse por qué está exponiendo los datos internos del Objeto en cuestión.
que sugiere que lea este artículo - http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html

+0

Toma todo lo que Alan Holub dice con un gran grano de sal; él es un extremista de encapsulación como ocultación de datos. Si está escribiendo una aplicación de simulación, acepto que no desea exponer el estado; pero para otras aplicaciones, piense en la encapsulación como protección de datos (cambios de control en sus datos) frente a la ocultación de datos (no permita que otros sepan que tiene datos) –

+1

Supongo que uno puede llamar a Holub un extremista, pero también se menciona Holub Point por Joshua Bloch, véase el artículo efectiva de Java 13 - http://books.google.com/books?id=ZZOiqZQIbRMC&pg=PA63&lpg=PA63&dq=favor+immutability&source=bl&ots=UZOZ8thI62&sig=FwssZOJiYmMmxS3nATJpW4Xri-8&hl=en&ei=57wRSpf5BZfKtgfm-ImRCA&sa= X & oi = book_result & ct = result & resnum = 2 # PPA63, M1 – KingInk

3

Una manera independiente IDE es utilizar Lombok, una biblioteca basada en la anotación que genera captadores, organismos, e incluso equals() y hashcode(). Hace esto para el compilador, pero no en el archivo de origen, por lo que no tiene que mirar los métodos, simplemente utilícelos.

+0

¡Diseño horrible (rojo raro, muchas fuentes diferentes e inadecuadas), herramienta práctica! Gracias drhorrible! –