2010-03-10 16 views
6

Quando il nome del tipo è troppo lungo, in C# posso creare alias come questo:"utilizzando" direttiva in Java

using Dict = System.Collections.Generic.Dictionary<string, string>; 

E posso usare in questo modo:

Dict d = new Dict(); 
d.Add("key", "value"); 

Posso creare un alias simile a questo in Java?

+2

Personalmente, non lo farei. Penso che renda il codice più difficile da comprendere. Importa spesso lo spazio dei nomi completo in modo da non dover qualificare i tipi, ma il bit di aliasing IMO rende solo più difficile comprendere il codice spostando la definizione del tipo dall'utilizzo. Preferirei: 'using System.Collection.Generic; ... var d = nuovo dizionario (); ' – tvanfosson

risposta

7

Non è possibile creare un alias, ma è possibile import pacchetti (JLS 7.5 Import Declarations) in modo che non si deve qualificare completamente i nomi di classe in quel pacchetto.

import java.util.*; 
import java.lang.reflect.Field; 

.... 

Set<Field> s = ... // Set is in java.util 

si può anche fare un static import (guide), anche se questa pratica dovrebbe essere limitato.

import static java.util.Arrays.asList; 

... 

System.out.println(asList(1, 2, 3)); 
+0

Sì, lo so. Ma a volte il nome del tipo (senza namespace/pacchetto) è troppo lungo. Esempio: HashMap - è troppo lungo per me ... Grazie per la risposta. –

+2

Nessun aliasing, mi dispiace. Troppi vantaggi, troppi svantaggi. – polygenelubricants

+1

Si può effettivamente fare pubblico classe MyHashMap static estende HashMap {} e poi fare: nuova MyHashMap() ovunque sia necessario. –

2

Risposta breve: nope.

Tuttavia, è possibile (e dovrebbe) import classi in modo da non usare per il loro nome completo:

import java.lang.String 
// .... 
String s = "hello, world."; 

Se necessario definire un alias da quando la classe sta usando farmaci generici multi-livello o roba del genere , è possibile utilizzare questo hack - definendo una classe privata che estende la classe si sta aliasing (generici inclusi) solo per il gusto di avere un facile da usare manico:

class MyMap extends HashMap<String, String> {} 

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

(aggiunta di alias di classe è stata richiesta presso as an enhancement to Java, ed è ancora in corso)

+5

@Yuval - questo è un cattivo esempio. Tutte le classi in 'java.lang' sono implicitamente importate su richiesta. –

+4

@Stephen: non è questo il punto della domanda, questo è solo un esempio ... –

+1

@Yuval - Non voglio creare un nuovo tipo. Saranno più problemi che benefici. –

0

No, non si può fare così in java.Here è necessario importare i pacchetti, se non si vuole importare il pacchetto quindi è necessario utilizzare il nome completo della classe.

-1

I secondo trucco della sottoclasse di Yuval. Non è un grosso problema in termini di prestazioni o semantica.

In C#, Dizionario < stringa, stringa > è anche un nuovo tipo; ogni istanza di un tipo generico crea una nuova classe in fase di runtime.

+0

"Non è un grosso problema" è un'affermazione ridicola senza contesto. E C# non fa generici. CLR lo fa e sa come piegare il codice. Quindi no, "ogni istanza di un tipo generico crea una nuova classe in fase di runtime" è anche un falso reclamo. – sehe

Problemi correlati