2010-03-10 18 views
6

Cuando el nombre del tipo es demasiado largo, en C# que puede crear alias de la siguiente manera:"por medio de" directiva en Java

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

Y puedo utilizar de esta manera:

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

¿Puedo crear un alias similar a esto en Java?

+2

Personalmente, yo no haría esto. Creo que hace que el código sea más difícil de comprender. A menudo importo el espacio de nombres completo, así que no tengo que calificar tipos, pero el bit de aliasing IMO solo hace que sea más difícil entender el código al alejar la definición de tipo del uso. Prefiero: 'usar System.Collection.Generic; ... var d = new Dictionary (); ' – tvanfosson

Respuesta

7

No se puede crear un alias, pero se puede (JLS 7.5 Import Declarations) de modo que usted no tiene import paquetes para calificar plenamente nombres de las clases en ese paquete.

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

.... 

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

También puede hacer un static import (guide), aunque esta práctica debe ser limitado.

import static java.util.Arrays.asList; 

... 

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

Sí, lo sé. Pero a veces el nombre del tipo (sin espacio de nombre/paquete) es demasiado largo. Ejemplo: HashMap - es demasiado largo para mí ... Gracias por la respuesta. –

+2

Sin aliasing, lo siento. Muy pocas ventajas, demasiadas desventajas. – polygenelubricants

+1

Usted puede hacer realidad MyHashMap clase estática pública se extiende HashMap {} y luego hacer: nueva MyHashMap() en cualquier lugar que lo necesite. –

2

Respuesta corta: no.

Sin embargo, puede (y debe) import clases con el fin de no utilizar su nombre completo:

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

Si debe definir un alias ya que su clase está utilizando genéricos multi-nivel o lo que sea , puede utilizar este truco - mediante la definición de una clase privada que se extiende la clase que estés aliasing (genéricos incluidos) por el simple hecho de tener un mango fácil de usar:

class MyMap extends HashMap<String, String> {} 

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

(adición de alias de clase Se solicitó antes de as an enhancement to Java, y todavía está pendiente)

+5

@Yuval - ese es un mal ejemplo. Todas las clases en 'java.lang' se importan implícitamente a pedido. –

+4

@Stephen: ese no es el punto de la pregunta, este es solo un ejemplo ... –

+1

@Yuval - No quiero crear un tipo nuevo. Será más un problema que un beneficio. –

0

n no se puede hacer así en java.Here necesita importar los paquetes, si no desea importar el paquete, entonces usted necesita para usar el nombre de clase completo.

-1

Mi segundo truco de subclase de Yuval. No es un gran problema en rendimiento o semántica.

En C#, < cadena de texto, cadena > también es un tipo NUEVO; cada instanciación de un tipo genérico crea una nueva clase en tiempo de ejecución.

+0

"No es gran cosa" es una afirmación ridícula sin contexto. Y C# no hace genéricos. CLR lo hace, y sabe cómo doblar el código. Entonces, no, "cada instanciación de un tipo genérico crea una nueva clase en tiempo de ejecución" también es un reclamo falso. – sehe

Cuestiones relacionadas