2010-03-10 19 views
14

En my answer from yesterday me llamaron el siguiente fragmento de código "un truco":¿Es aceptable declarar una clase privada como un alias?

final class MyMap extends HashMap<SomeSuperLongIdentifier, OtherSuperLongIdentifier> {} 
// declared MyMap as an alias for readability purposes only 

MyMap a = new MyMap(); 
a.put("key", "val"); 

pensarlo más, esto no parece una mala idea en absoluto, pero puede ser que falte algo. ¿Hay algún bache en el que me perdí? ¿Es esta una forma aceptable (posiblemente creativa) para declarar alias en Java?

+0

Agregó el modificador 'final' según las recomendaciones ... –

Respuesta

5

El inconveniente sería que no podrá usar directamente ningún método que devuelva un Map correctamente escrito, ya que nunca devolverán un MyMap. Incluso si pudieran devolver un Map<SomeSuperLongIdentifier, OtherSuperLongIdentifier>. Por ejemplo, no podría usar los métodos filter() en Maps (proporcionado por Google Collections). Habrían aceptar una instancia MyMap como entrada, pero habrían devolver solo Map<SomeSuperLongIdentifier, OtherSuperLongIdentifier>.

Este problema puede reducirse de alguna manera al escribir su MyMap para delegar en otra implementación de Map. Luego, puede pasar el valor de retorno de dicho método al constructor y aún tener un MyMap (sin copiar, ni siquiera). El constructor predeterminado podría simplemente configurar el delegado en una nueva instancia de HashMap, por lo que el uso predeterminado se mantendría igual.

2

Yo personalmente no haría esto, y lo marcaría en una revisión, pero esto es una cuestión de opinión.

Google Colecciones ayuda a mitigar este problema, al permitir que se declara:

Map<SomeSuperLongIdentifier, OtherSuperLongIdentifier> a = Maps.newHashMap(); 

buscaría formas de refactorizar código para no tener que declarar tantos casos de este mapa, tal vez.

2

Mientras los desarrolladores que usen su código tengan IDEs y puedan saltar rápidamente a la definición de clase y leer los comentarios para su propósito (que están en su lugar, ¿no?), No veo nada de malo en ello.

+0

Además, los problemas de alias no son tan malos porque el OP preguntó acerca de las clases" privadas "por lo que el" alias "no tiene fugas. –

3

Creo que seguramente es una forma conveniente de declarar tipos sinónimos. Algunas lenguas tienen un apoyo directo para que (en Delphi (Pascal), por ejemplo, puede hacer que al igual que:.

type MyMap = HashMap<SomeSuperLongIdentifier, OtherSuperLongIdentifier>; 

Dado que Java no, creo que se puede utilizar la herencia para eso se necesita para documentar, que esta declaración es solo un sinónimo y nadie debería agregar los métodos para esta clase. Tenga en cuenta también, que esto consume un poco de memoria para el almacenamiento de VMT.

+0

Para asegurarse de que nadie puede agregar métodos, simplemente declare 'final' –

+2

@Aaron Digulla. Eso solo se aplica a las subclases. Alguien podría venir más tarde y agregar métodos a 'MyMap' y el' final' no lo detendría. –

+0

Este tipo de sinónimo podría ser útil, pero no es posible en Java. Una subclase no es un sinónimo. –

0

No lo llamaría un truco. Personalmente, he creado un alias con el propósito de declarar parámetros de tipo genérico que no se pueden cambiar y crear cierta claridad.

3

Me opongo al nombre MyMap: como creas un alias, haz que documente su propósito dándole un nombre útil. Aparte de eso, me gusta.

+0

'MyMap' es solo un nombre de ejemplo, por supuesto, en el código de la vida real, este debería ser un nombre significativo. –

1

Creo que la herencia es un arma muy grande en comparación con el problema en cuestión. Por lo menos, habría hecho esta "clase de alias" final, con un gran comentario que describe la razón de su existencia.

+0

Hecho final :) –

+0

También debe tomar una decisión con respecto a los constructores que elija exponer. –

1

Bueno, aquí hay dos aspectos contradictorios.

  1. Desde un punto de vista de modelado, su declaración es derecho, porque hace hincapié en la encapsulación de su clase proporciona.
  2. Desde un punto de vista de codificación, su declaración puede considerarse incorrecta porque agrega una clase solo como soporte de modelado, sin ninguna función adicional.

Sin embargo, su enfoque es bastante correcto (aunque nunca lo pensé antes), ya que proporciona un modelo muy apreciado (bueno, para mí, al menos): las clases de su modelo se reflejan perfectamente en su código, haciendo que sus especificaciones sean ejecutables, lo que es genial.

Todo esto me lleva a decir que definitivamente es una gran idea, siempre que lo respalde con la documentación.

2

No lo llamaría un 'alias'. No lo es No se puede usar indistintamente con el tipo que se supone que es aliasing. Entonces, si esa es la intención, falla.

0

Tampoco podría usar este mapa en la serialización si está enviando a otro jvm que no tiene su clase MyMap.

Cuestiones relacionadas