2012-04-23 16 views
9

¿Es posible hacer referencia a tipos de Java con un nombre parcialmente calificado? ¿Si es así, cómo?Tipo de referencia con espacio de nombre parcialmente calificado

El escenario: frecuentemente me encuentro con una clase de datos (por ejemplo, Activity) que necesita una vista. Mi práctica habitual ha sido nombrar esta clase , que funciona, pero esta clase de vista invariablemente termina en un espacio de nombre tld.organization.project.views, donde el sufijo "Ver" es completamente redundante.

Me gustaría eliminar el sufijo "Ver" (por lo que los tipos serían tld.organization.project.Activity y tld.organization.project.views.Activity), pero esto significa que debo usar el espacio de nombres para calificar los tipos cuando los hago referencia en la misma clase. Usar el espacio de nombre para calificar las referencias de tipo no es malo en sí mismo, pero repetir el nombre completo de cualquiera de los tipos es repetitivo y difícil de leer.

referencia a un tipo cualificado parcialmente (algo así como ~.Activity o ~.views.Activity) que eliminaría costra. Algún tipo de alias de tipo respondería, pero parece que Java no es compatible con dicha funcionalidad. ¿Hay alguna alternativa?

+0

Además de 'import tld.organization.project.views. *'? –

+0

No creo que importar el tipo sea útil en este caso, porque los nombres cortos del tipo son los mismos. Actualizaré la pregunta para aclarar eso. – cqcallaw

+0

Se llaman 'nombres de paquetes', no espacios de nombres. –

Respuesta

4

No, no puedes hacer eso con paquetes en Java. Lo más cercano que podría obtener sería organizar cosas en jerarquías anidadas de clases en lugar de paquetes. Entre eso y la importación estática estratégica, podría obtener el efecto deseado, aunque sería una solución terriblemente desordenada. Por ejemplo:

package tld.organization.project; 
public class Activity {} 

y:

package tld.organization.project; 
public class Views { 
    public static class Activity {} 
} 

que luego puede ser denominado:

public void whatever() { 
    Activity a = new Activity(); 
    Views.Activity a2 = new Views.Activity(); 
} 

me gustaría sugerir que los problemas que tiene con los nombres pueden estar apuntando a un problema de diseño que necesita ser resuelto.

P.S. Si alguna vez tuviera que trabajar en un proyecto que organizara clases así, podría tener que dispararme a mí mismo.

P.P.S. En realidad, probablemente trataré de dispararte primero.

+0

Voto a favor de postscripts francos. ;) Sin embargo, estoy teniendo problemas para ver los problemas de diseño de la estructura propuesta. Es una aplicación bastante directa del patrón de diseño MVC. Tenía la impresión de que la separación de preocupaciones (el modelo de datos y la vista de datos en este caso) se consideraba casi universalmente * buena * práctica de diseño ... – cqcallaw

+2

La separación viene en muchos sabores. Dado el rango de interpretaciones de "MVC", no quiero suponer que sé lo que quiere decir con "datos" frente a clases "ver", pero veo un indicador en los nombres de los paquetes de una práctica con la que nunca he estado de acuerdo : clases de empaquetado basadas en la "capa" de la aplicación en la que viven. Es decir, tener un paquete "dao" con UserDao, AccountDao, ..., y un paquete "ver" con UserView, AccountView, ... Mi opinión firme es que es mucho más comprensible y menos propenso al enredo de paquetes tener un paquete de "usuario" y "cuenta", cada uno con las clases correspondientes. –

+0

Interesante. Puedo ver las ventajas de su enfoque preferido, pero no estoy seguro de que resuelva mi problema original: cada vez que dos unidades funcionales interactúan (digamos que el "usuario" DAO necesita interactuar con el DAO "cuenta"), tenemos el mismo problema de nombres idénticos no calificados. Además, parece que le gustaría tener la seguridad de que no es probable que se necesiten nuevas "capas", ya que agregar una nueva clase a cada paquete para la nueva "capa" sería bastante laborioso. – cqcallaw

-1

¿Estás tratando de decir que usted no desea escribir:

tld.organization.project.views.ActivityView 

cada vez que utilice ?

Uso import

por ejemplo. En lugar de utilizar el nombre completo de la clase JOptionPane así:

class ImportTest { 
    public static void main(String[] args) { 
     javax.swing.JOptionPane.showMessageDialog(null, "Hi"); 
     System.exit(0); 
    } 
} 

Importe la clase en el comienzo de esta manera:

import javax.swing.JOptionPane; // Make a single class visible. 

class ImportTest { 
    public static void main(String[] args) { 
     JOptionPane.showMessageDialog(null, "Hi"); 
     System.exit(0); 
    } 
} 

Ahora usted puede utilizar directamente JOptionPane en su clase.

+0

Quiere calificar * parcialmente * el nombre, es decir, 'views.Activity' en lugar de' Activity' o 'tld.blablabla.views.Activity''. – sepp2k

+0

Sí, lo siento, mi pregunta no estaba clara. Lo he actualizado – cqcallaw

+0

Funciona porque 'JOptionPane' es una clase, pero la idea es poder hacer algo similar con un paquete. – Daniel

Cuestiones relacionadas