2012-09-05 29 views
20

En C/C++ utilizamos variables locales estáticas para mantener el estado de un método. ¿Pero por qué no es compatible con Java?¿Por qué no hay una variable estática local en Java?

Sí, puedo usar un campo estático para este propósito. ¿Pero no es un poco extraño crear un campo para mantener solo el estado de un método?

+3

"raro" es muy subjetivo. – Richard

+0

¿cuál es tu caso de uso? En general, tiene sentido que los datos estáticos sean parte del estado del objeto. – TJD

+0

@Richard - sí, no es extraño ... simplemente diferente. –

Respuesta

32

Ha encontrado la única solución.

Java eliminó una serie de complejidades de C++, y esta fue una de ellas.

Las variables estáticas con alcance a una función le causan molestias en la concurrencia (por ejemplo, strtok es una muy desagradable para usar con pthreads, por exactamente esta razón).

En general, lo que desea es un objeto con estado. La función en cuestión debería tener una variable de nivel de objeto. Luego, puede crear instancias que mantengan cada estado.

Mucho más fácil de entender/mantener/etc.

Si realmente necesita mantener el estado como singleton, entonces los campos estáticos lo son.

0

Quizás porque los métodos no son objetos en Java; así que mantener su estado como dijiste no tiene mucho sentido y supongo que tendrías que crear un nuevo concepto en el código de bytes para eso; usa un objeto como dijo Tony K.

5

La especificación de lenguaje Java no parece defender la omisión de las variables que corresponden a las variables C static.

Ocultar el estado en los métodos de clase tiene algunos inconvenientes cuando se ve desde una perspectiva de Java. En general, la existencia de una variable estática de nivel de función no es el tipo de detalle de implementación que desea exponer fuera de esa función.

Pero el estado del método es en realidad parte del estado de la clase, y las variables estáticas a nivel de método tendrían que serializarse/deserializarse cada vez que se persista el objeto. Es posible que esto no suene común, provenga de un fondo C, así que mencionaré algunos ejemplos comunes.

  • Los clústeres de servidores de aplicaciones pueden pasar objetos de sesión de usuario entre nodos para proporcionar tolerancia a errores.
  • JAXB se podría utilizar para ordenar de un objeto en un documento XML
  • APP se puede utilizar para mantener el estado de objeto a una base de datos de

Si el valor de la variable es vale la pena ahorrar cuando se conserva el objeto, entonces hay una buena probabilidad de que el código fuera de esa clase necesite referenciar ese valor. Y de repente eso significa definir niveles de acceso: ¿una variable estática en un método público es automáticamente pública? ¿O un programador tendría que declararlo así?

También tenemos que pensar en la extensibilidad. ¿Se requerirían clases derivadas para implementar la misma variable estática? ¿O habría una referencia a la variable de la función en la clase base?

Es más probable que el método C que usaría una variable local estática sería un buen candidato para una clase en Java. Tiene estado y, con suerte, existe para un solo propósito.Hay un pequeño inconveniente al encapsular la funcionalidad en un objeto, y hace una separación más limpia entre los valores transitorios (como las variables locales) y el estado a más largo plazo.

1

Algunas de las otras respuestas muestran por qué es posible que no desee tener esto. Pero también puedes preguntar por qué desde una perspectiva histórica.

Para responder a esto, debe comenzar a ver por qué C tiene variables locales estáticas. C tiene muchos menos medios que Java y C++ para limitar el alcance de una variable, las únicas opciones para los datos estáticos son 'dentro del archivo' y 'en todas partes'. Por lo tanto, esto proporciona una capa adicional para limitar el alcance.

Un aspecto importante de C++ es la compatibilidad, por lo que también está permitido en C++. Pero ya no necesita un alcance estático local, ya que hay muchos otros medios para limitar el alcance de los datos estáticos. El uso no es popular en C++ (moderno).

Java simplemente se inspira mucho en C/C++, no tuvo que preocuparse por la compatibilidad con versiones anteriores, por lo que podría omitirse.

Cuestiones relacionadas