2012-04-23 11 views
9

È possibile fare riferimento a tipi Java con un nome parzialmente qualificato? Se é cosi, come?Tipo di riferimento con namespace parzialmente qualificato

Lo scenario: mi trovo spesso con una classe di dati (ad esempio Activity) che necessita di una vista. La mia pratica standard è stata quella di denominare questa classe , che funziona, ma questa classe di visualizzazione finisce invariabilmente in uno spazio dei nomi tld.organization.project.views, in cui il suffisso "Visualizza" è completamente ridondante.

Vorrei rimuovere il suffisso "Visualizza" (quindi i tipi sarebbero tld.organization.project.Activity e tld.organization.project.views.Activity), ma ciò significa che è necessario utilizzare lo spazio dei nomi per qualificare i tipi quando li faccio riferimento nella stessa classe. Utilizzare lo spazio dei nomi per qualificare i riferimenti ai tipi non è una cosa negativa di per sé, ma ripetere il nome completo di entrambi i tipi è ripetitivo e difficile da leggere.

Il riferimento a un tipo di tipo 10 parziale (tipo ~.Activity o ~.views.Activity) rimuove tale numero. Qualche tipo di aliasing risponderebbe, ma sembra che Java non supporti tale funzionalità. Ci sono alternative?

+0

Oltre a importare tld.organization.project.views. * '? –

+0

Non penso che importare il tipo sia utile in questo caso, perché i nomi brevi del tipo sono gli stessi. Aggiornerò la domanda per chiarirlo – cqcallaw

+0

Sono chiamati 'nomi di pacchetti' non spazi dei nomi. –

risposta

4

No, non è possibile farlo con i pacchetti in Java. Il massimo che si potrebbe ottenere sarebbe quello di organizzare le cose in gerarchie nidificate di classi invece di pacchetti. Tra questo e l'importazione statica strategica, è possibile ottenere l'effetto desiderato, anche se sarebbe una soluzione terribilmente disordinata. Per esempio:

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

e:

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

che possono poi essere indicato come:

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

mi suggeriscono che i problemi si hanno con i nomi possono essere rivolte a un problema di progettazione che deve essere risolto.

P.S. Se dovessi mai lavorare su un progetto che organizzava le lezioni così, potrei dover spararmi.

P.P.S. In realtà, probabilmente proverei a spararti prima.

+0

Voto positivo per post script frettoloso. ;) Ho difficoltà a vedere i problemi di progettazione della struttura proposta, però. È un'applicazione abbastanza semplice del modello di progettazione MVC. Avevo l'impressione che la separazione delle preoccupazioni (modello di dati e visualizzazione dei dati in questo caso) fosse quasi universalmente considerata * buona * pratica di progettazione ... – cqcallaw

+2

La separazione arriva in molti gusti. Data la gamma di interpretazioni di "MVC", non voglio presumere di sapere cosa intendi per classi "dati" vs "vista", ma vedo un indicatore nei nomi dei pacchetti di una pratica che non ho mai concordato con : classi di imballaggio basate sul "livello" dell'applicazione in cui vivono. Cioè, con un pacchetto "dao" con UserDao, AccountDao, ... e un pacchetto "view" con UserView, AccountView, ... La mia ferma opinione è che è molto più comprensibile e meno incline al groviglio di pacchetti per avere invece un pacchetto "utente" e "account", ciascuno contenente le classi pertinenti. –

+0

Interessante. Vedo i vantaggi del tuo approccio preferito, ma non sono sicuro che risolva il mio problema originale: ogni volta che due unità funzionali interagiscono (diciamo che il DAO "utente" deve interagire con l'account "DAO"), abbiamo lo stesso problema di nomi identici non qualificati. Inoltre, sembra che tu voglia essere abbastanza sicuro che nessun nuovo "layer" sarà probabilmente necessario, poiché aggiungere una nuova classe a ogni pacchetto per il nuovo "layer" sarebbe abbastanza laborioso. – cqcallaw

-1

Stai cercando di dire che non volete scrivere:

tld.organization.project.views.ActivityView 

ogni volta che si utilizza ?

Usa import

ad es. Invece di usare il nome completo della classe JOptionPane in questo modo:

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

Importa la classe in principio come questo:

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

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

Ora è possibile utilizzare direttamente JOptionPane nella classe.

+0

Vuole * parzialmente * qualificare il nome, ovvero 'views.Activity' invece di' Activity' o 'tld.blablabla.views.Activity'. – sepp2k

+0

Sì, scusa la mia domanda non è stata chiara. L'ho aggiornato. – cqcallaw

+0

Funziona perché 'JOptionPane' è una classe, ma l'idea è di essere in grado di fare qualcosa di simile con un pacchetto. – Daniel

Problemi correlati