He encontrado una publicación aquí en SO discutiendo el cambio de código requerido para evitar escribir en un campo estático de un método de instancia, pero ¿por qué no es una buena práctica hacerlo? ¿Por qué los diseñadores de Java lo permitieron? En otras palabras, ¿por qué el compilador no arroja un error cuando alguien intenta hacer esto?¿Por qué no es bueno escribir en el campo estático del método de instancia en Java?
Respuesta
En palabras de la documentación 'findbugz':
Este método de instancia escribe en un campo estático. Esto es complicado de corregir si se manipulan varias instancias y, en general, es una mala práctica.
Lo que quiere decir que no siempre es incorrecto, simplemente que es algo que a menudo es una fuente de errores. Los objetos de instancia que manipulan campos estáticos pueden ser útiles, por ejemplo, para la inicialización lenta de objetos compartidos, por lo que no siempre es incorrecto, pero puede ser difícil hacerlo bien (especialmente si se pueden ejecutar varios hilos al mismo tiempo).
Además de lo anterior, desde un punto de vista la documentación es fácil para alguien que asuma que es un campo de instancia, si se utiliza la forma:
someField = null
o
myObj.someField = null
utilizando el formulario
myClass.someField = null
hace que sea más clara y evita la advertencia findbugz (al parecer, no he probado). Tenga en cuenta que eso no evitará los problemas de subprocesos múltiples descritos.
Puede ser útil, por ejemplo, si tienes una aplicación que administra hormigas y necesitas poder acceder al número total de hormigas creadas de la clase de hormigas. Esto se puede hacer escribiendo a un método estático que realiza un seguimiento del número total de hormigas cada vez que crea una nueva hormiga escribe en el método estático addAnt();
- 1. ¿Por qué mi método estático oculta mi método de instancia?
- 2. ¿Por qué no puedo inicializar el campo estático en C++
- 3. Inicialización de campo estático Java
- 4. Java: ¿El método genérico solo es estático?
- 5. C# Método estático vs instancia de objeto
- 6. Sincronización en el método estático y de instancia
- 7. Cómo sincronizar el método estático en java
- 8. ¿Por qué Sass es bueno?
- 9. ¿Qué es un "método estático" en C#?
- 10. ¿Por qué el '{' arroja una NullReferenceException en un método estático?
- 11. this == null método de instancia .NET - ¿por qué es posible?
- 12. ¿El método estático es más rápido que el no estático?
- 13. ¿Qué aspecto tiene un método estático de Java en Ruby?
- 14. ¿Por qué no está disponible getClass() como método estático?
- 15. ¿Por qué Java permite el acceso de un miembro estático con una instancia de objeto
- 16. ¿Por qué JavaMail Transport.send() es un método estático?
- 17. del campo estático
- 18. ¿Qué tan bueno es el método Rails sanitize()?
- 19. Refactoring método estático/campo estático para las pruebas
- 20. ¿Es posible escribir el método de intercambio en Java?
- 21. ¿Por qué no es bueno exponer el Modelo a través de ViewModel en Silverlight MVVM?
- 22. Cómo escribir un método getitem python estático?
- 23. Crear instancia de clase desde el método estático
- 24. Java - ¿El método hashCode() de la clase Point es bueno, o debería anularlo y escribir el mío?
- 25. ¿Por qué un delegado no puede hacer referencia a un método no estático cuando se usa en un método estático?
- 26. ¿Por qué FileChannel en Java no es de no bloqueo?
- 27. ¿Llamar método estático de instancia en PHP, desaprobación futuro?
- 28. Conversión de C# a VB.NET: ¿por qué el método estático no es visible?
- 29. método estático no puede implementar el método de interfaz, ¿por qué?
- 30. ¿Qué hace sincronizado en un método estático?
¿Cómo funciona la ejecución simultánea de varios subprocesos en este código para que tenga errores? Mi pregunta era para obtener una respuesta a esto en realidad. ¿Tenemos la posibilidad de crear múltiples instancias del campo? – Inquisitive
Solo queda un campo, pero si dos de ellos intentan escribir casi al mismo tiempo, puede terminar con la creación de dos objetos y el cambio del campo, mientras que probablemente solo haya deseado una copia del objeto. . Esto podría causar problemas graves en algunos casos, ya que diferentes instancias del objeto propietario podrían estar utilizando diferentes objetos compartidos. Debería colocar un bloque sincronizado (this.getClass()) alrededor de cualquier código que pueda cambiar el campo estático para asegurarse de que funcionó. – Jules