tipo - matriz string java
¿Por qué no usar una matriz estática de cadenas? (4)
Algunos de ellos son arbitrarios. Por ejemplo, tener una única declaración de retorno es una cuestión de estilo (¿puede estar relacionado con alguna herramienta de análisis que en el pasado no pudo manejar varias rutas de retorno?).
Algunos de ellos están desactualizados. Como el de StringBuilding.
Supongo que se trata de una mezcla de antiguas recomendaciones de rendimiento y guías de estilo. Reconozco que la matriz estática de String se encuentra en la última categoría, tal vez con un indicio de lo que otros han dicho sobre el posible vínculo con la introducción de enumeraciones (tal vez esa sea la razón en particular de Strings).
Algunos de ellos en realidad son completamente inviables cuando intenta aplicarlos a los marcos modernos: "No use un interruptor para realizar una llamada en función del tipo de objeto". Por ejemplo, está en el núcleo del método Akka Java (onReceive) y En general en cualquier tipo de coincidencia de patrones en Java ...
Aunque admito que es curioso, yo diría que probablemente sea algo relacionado con alguna herramienta específica que usaron en el pasado o con la posibilidad de enumeración mencionada. Pero es solo mi opinión, no una respuesta definitiva.
Encontré este estándar de codificación de Oracle :
No utilice una matriz estática de cadenas.
¿Cuál es la razón de esta recomendación?
De esta manera socava el paradigma orientado a objetos. Además, es un agujero de seguridad, porque la palabra clave final
asegura solo el valor de referencia y deja que el contenido se cambie fácilmente.
Las matrices son contenedores mutables. El contenedor mutable global sin sincronización incorporada es un horror multihilo esperando que suceda. Puede almacenar la referencia a esa matriz en algún contexto local y luego cambiar su contenido en cualquier momento sin que usted lo sepa. O viceversa, puede asumir que este es un estado global conveniente, pero entonces cada cliente debe saber la manera correcta y exacta de sincronizar su acceso a ese estado. Y alguien olvidará y nacerá un insecto.
Creo que se debe a que los desarrolladores usaron String
como reemplazo (probablemente sin intención) para la enumeración, y static String[]
fue una forma de agrupar estos tipos.
Podría estar apuntando a fallas de diseño que eran comunes en el momento en que se escribió el artículo
Por lo que sabemos, este artículo podría estar dirigido a la base de 4 códigos de Java.
No digo que esto fue escrito durante Java 4, pero que la mayoría del código de producción existente en ese momento puede haber sido escrito en Java 4 . La falta de trampas autoboxing (que son bastante comunes) y ninguna mención de los genéricos (tipos crudos) me llevan a creer esto.
¿Por qué Oracle haría cumplir un principio tan críptico?
No creo que tenga que ver con el estado global, ya que estoy seguro de que se habrían mencionado los singletons (siendo la pinícula del estado global).
Dudo que la concurrencia sea el problema, ya que el artículo no menciona nada más acerca de compartir datos en subprocesos, o incluso usar múltiples subprocesos. Usted asumirá que habrían mencionado ALGO sobre el entorno de subprocesos.
El uso indebido de String
para propósitos de enumeración de tipos era común en el pasado, así que estoy seguro de que esta declaración (si está relacionada con lo que creo que es) era mucho más fácil de entender en ese entonces. Creo que es bastante exagerado que esta afirmación fuera tan críptica en aquel entonces, sin embargo, a nadie le ha importado cuestionarla , lo que resulta en la falta de resultados de Google al investigar esto.
Mi respuesta
Los desarrolladores hasta el día de hoy siguen haciendo mal uso de String
para obtener información de tipo. Con la falta de enumeración, pude ver cómo un desarrollador puede tener la tentación de hacer algo como:
class Card {
static String HEARTS = "HEARTS";
static String DIAMONDS = "DIAMONDS";
static String CLUBS = "CLUBS";
static String SPADES = "SPADES";
static String[] CARD_TYPE = {
HEARTS, DIAMONDS, CLUBS, SPADES
};
private String type;
//...
}
Uso de la matriz para un bucle fácil (como uno haría con Enum.values()
).
Usar String
como enums está mal visto:
No es de tipo seguro. Si
MAGE
se puede pasar a un método, se puede pasar CUALQUIERString
en su lugar. Esto nos lleva a ...Los errores son más fáciles de cometer. Es posible que un error tipográfico pase desapercibido, lo que puede parecer pequeño para el desarrollador promedio, pero podría ser catastrófico para las empresas con grandes bases de código y muchos consumidores (como Oracle). Por ejemplo: un error tipográfico oculto resulta en una comparación que devuelve falso. Esto evita que se inicie un servicio. La falta de este servicio resulta en un error. Si no se encuentra antes de que los usuarios noten el error, podría conducir a explotaciones.
Esto podría solucionarse utilizando el sistema de tipos integrado de Java:
abstract class CardType {
}
class Hearts extends CardType {
}
....
O
enum CardType {HEARTS, DIAMONDS, ...; }
No solo es menos propenso a errores, sino que también le permite utilizar polimorfismo, lo que evita la necesidad de verificar el valor para desencadenar un comportamiento específico. El comportamiento puede estar contenido en el propio tipo.
Aunque no puedo prometer que esta sea la respuesta correcta, parece ser la única respuesta que no depende del uso de modificadores que no se mencionaron en la declaración.
Sí, el ejemplo anterior no utiliza las constantes adecuadas (carece de la final
). Pero aunque se deben preferir las constantes, no se requiere que se beneficien de este diseño (poder usar String
para obtener información de tipo) ni el diseño requiere que funcione. Dado que las personas no siempre han usado constantes para esto, podrían haber omitido la final
o " conjunto de constantes " para este propósito.