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?
Respuesta
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.
¡Gracias! Este parece un buen método. – user1150769
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.
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.
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.
No está mal, pero generalmente querrá encapsulate el estado de un objeto.
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.
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:
- 1. ¿Es una mala práctica tener estado en una clase estática?
- 2. Tener propiedades públicas en la clase C++
- 3. Rieles: ¿es malo tener una migración irreversible?
- 4. ¿Es malo declarar una clase vacía?
- 5. ¿Usar demasiada estática es malo o bueno?
- 6. ¿Podemos tener un constructor privado en una clase estática?
- 7. ¿Cuál es la ventaja de tener clases internas estáticas públicas de una interfaz/clase?
- 8. variables de clase estática Objective C
- 9. ¿Por qué tienen todos los métodos/variables estáticos en una clase no estática?
- 10. ¿Por qué una clase interna no estática no puede tener miembros estáticos (campos y métodos)?
- 11. ¿Cómo obtener propiedades públicas de una clase?
- 12. serializar una clase estática?
- 13. ¿Por qué es malo tener un functor local?
- 14. Error de enlace al declarar variables estáticas públicas en C++
- 15. clase estática vs clase singleton
- 16. Clase C# (no estática) para representar rutas
- 17. ¿Es posible tener una clase privada?
- 18. Tener 2 variables con el mismo nombre en una clase que amplía otra clase en Java
- 19. Método principal en una clase interna estática.
- 20. Inyectando una dependencia en una clase estática
- 21. ¿Por qué podemos tener miembros finales estáticos pero no podemos tener un método estático en una clase interna?
- 22. Diferencia entre variables estáticas públicas y privadas estáticas
- 23. ¿Por qué prefieren Propiedades a variables públicas?
- 24. ¿Por qué las clases estáticas no pueden tener métodos y variables no estáticos?
- 25. Declarar una función estática y luego no estática: ¿es estándar?
- 26. ¿Es malo tener un archivo grande de utilidad?
- 27. clase estática y singleton
- 28. Marcado de una clase estática en VB.NET
- 29. que imita una clase estática
- 30. Clases anidadas "públicas" o no
Siempre use variables privadas con setters/captadores menos que realmente tiene que –
@JimmyGustafsson: ¿Por qué ?? Si los getters/setters realmente no hacen nada más que obtener/establecer los valores, ¿por qué no hacerlos públicos? –
¿Qué representan los booleanos _acerca de_ claves? – paislee