2012-03-12 13 views
5

Estoy escribiendo un juego y tengo una clase para la entrada que contiene booleanos para todas las teclas diferentes. Creo una instancia de esta clase en la clase de juego principal. ¿Está bien que los booleanos sean públicos, o debo acceder a ellos con accesodores?¿Es malo tener variables públicas en una clase no estática?

+4

Siempre use variables privadas con setters/captadores menos que realmente tiene que –

+2

@JimmyGustafsson: ¿Por qué ?? Si los getters/setters realmente no hacen nada más que obtener/establecer los valores, ¿por qué no hacerlos públicos? –

+0

¿Qué representan los booleanos _acerca de_ claves? – paislee

Respuesta

4

lugar de tener un boolean para cada tecla, sería más fácil de leer y más fácil de codificar si has tenido una private Map<String, Boolean> keyStates, con todas las claves inicializan a false.A continuación, sus descriptores de acceso podría ser:

public void setPressed(String keyName) { 
    keyStates.put(keyName, true); 
} 

public void setReleased(String keyName) { 
    keyStates.put(keyName, false); 
} 

public boolean isPressed(String keyName) { 
    return keyStates.get(keyName); 
} 

La razón general por tener métodos de acceso en lugar de las variables públicas es que permite a la clase para cambiar su aplicación sin necesidad de cambios en las clases que interactúan con sus miembros. Por ejemplo, con lo anterior, ahora puede agregar código para contar o registrar las pulsaciones de teclas, o cambiar el tipo subyacente de Map utilizado, sin exponer nada de esto al exterior.

Ésta es no preferencia personal. EncapsulationInterfaces y forman parte integrante del OO Ingeniería de Software, y son las razones principales de diseño que Internet es posible desde un Punto de vista técnico.

+0

¡Gracias! Este parece un buen método. – user1150769

0

La práctica estándar consiste en hacer que las variables miembro estén protegidas o sean privadas con getters/setters que siguen la convención de beans Java. Esto tiende a ser algo detallado, pero hay una muy buena biblioteca (www.projectlombok.org) que genera los métodos getters/setters/constructors/toString/hashCode/equals para usted.

2

En general, recomendaría usar getters y setters ya que es más limpio, más organizado y más legible. Esto también ayudará si tienes muchos programadores diferentes mirando tu código. Mi punto de vista es siempre hacer que sus variables sean privadas a menos que necesite exponerlas por una razón específica. Si el rendimiento es realmente un problema en su juego, hacer que sus variables sean públicas ayudará un poco al reducir las llamadas a funciones.

0

Siempre es una buena práctica de programación java declarar las variables de clase como privadas y acceder a ellas con métodos getter y setter públicos a menos que sea realmente necesario declararlas como públicas.

Si está utilizando un IDE, solo tiene que hacer clic para generar getters y setters para las variables de clase/variables miembro.

3

Es principalmente una cuestión de gusto personal: estoy seguro de que encontrarás gente discutiendo en ambos lados, y yo diría que no es negro o blanco, sino que depende de cuán "grande" es la clase.

La razón de usar getters y setters es que abstraiga la representación real como un campo, para darle la libertad de comenzar a presentar esto como p. Ej. un valor derivado sin cambiar su interfaz. Entonces, realmente se trata de lo valiosa que es para ti la interfaz de esta clase.

Si es parte de su interfaz pública de primera clase, entonces definitivamente use getters y setters. En el otro extremo, si se trata de un simple titular de datos como una tupla que se utiliza únicamente en una sola clase (por ejemplo, para mapear filas de la base de datos antes de la transformación a otra clase), no dudaría en usar campos; no hay un valor real para la interfaz, ya que solo se usa internamente.

¿Cuántas clases/paquetes usarían esta clase? Si se trata de una clase privada, "local", entonces no creo que haya nada de malo con el uso de los campos y la actualización de las personas que llaman si alguna vez tiene que cambiar.

Acceder a los campos es mucho más fácil de justificar si también son final, que a menudo es el caso con este tipo de objeto.

0

Y ahora que se le ha dicho una y otra vez que use getter y setters, y porque está en Java (donde los IDE lo ayudan a hacer getters/setters trivialmente, y todos claramente los usan), lea este hilo para ayudar añadir un poco de equilibrio a su uso de ellos:

Getters and Setters are bad OO design?

Cuestiones relacionadas