2010-01-17 11 views
73

decir que haya un código como:Importación de dos clases con el mismo nombre. ¿Cómo manejar?

import java.util.Date; 
import my.own.Date; 

class Test{ 

    public static void main(String [] args){ 

    // I want to choose my.own.Date here. How? 
    .. 
    // I want to choose util.Date here. How ? 

    } 
} 

Debería ser nombres completos de clase completos? ¿Puedo deshacerme de las declaraciones de importación? ¿Es un escenario común en la programación del mundo real?

+0

realmente una respuesta a su pregunta pero en C# puede usar un alias para cualquier espacio de nombres. Puede ser solo azúcar sintáctico pero es realmente útil: http://msdn.microsoft.com/en-us/library/7f38zh8x.aspx – borjab

Respuesta

108

Puede omitir las instrucciones de importación y hacer referencia a ellas utilizando toda la ruta. Por ejemplo:

java.util.Date javaDate = new java.util.Date() 
my.own.Date myDate = new my.own.Date(); 

Pero yo diría que el uso de dos clases con el mismo nombre y una función similar no suele ser la mejor idea a menos que puede hacer que sea muy claro cuál es cuál.

+1

Si está utilizando Eclipse, puede cambiar el nombre de ' your.own.Date' usando ctrl + shift + R. Esto lo cambiará automáticamente a donde sea que se refiera en su código, así como en el archivo (y nombre de archivo) your/own/Date.java. Cualquier otro IDE probablemente tenga una característica similar. – MatrixFrog

+12

No estoy de acuerdo con la última declaración. Si desea diseñar su propia clase de fecha, la 'fecha' es el nombre perfecto. Lo usarás en la mayoría de tu código. Sin embargo, a veces deberá llamar al 'java.util.Date' especialmente para realizar conversiones entre ambos. – paradigmatic

+1

@MatrixFrog La función en Eclipse que ha especificado también la proporciona Netbeans IDE. Esta función se conoce como "Refactor". Su información no fue incorrecta, pero no es la respuesta a la pregunta. Si él (Roger) está desarrollando ese código, definitivamente sabe que puede cambiar o refactorizar el nombre de su Clase. Lo que él está pidiendo es diferente de la respuesta que le diste. –

15

utilice el nombre completo en lugar de importar la clase.

p. Ej.

//import java.util.Date; //delete this 
//import my.own.Date; 

class Test{ 

    public static void main(String [] args){ 

     // I want to choose my.own.Date here. How? 
     my.own.Date myDate = new my.own.Date(); 

     // I want to choose util.Date here. How ? 
     java.util.Date javaDate = new java.util.Date(); 
    } 
} 
+6

La mejor práctica es importar la más utilizada, utilizando la menos usada con full classpath – Alpaslan

7

Sí, cuando importe clases con los mismos nombres simples, debe consultarlas por sus nombres de clase totalmente calificados. Dejaría las declaraciones de importación, ya que les da a otros desarrolladores una idea de qué hay en el archivo cuando están trabajando con él.

java.util.Data date1 = new java.util.Date(); 
my.own.Date date2 = new my.own.Date(); 
2

Este escenario no es tan común en la programación del mundo real, pero tampoco es tan extraño. Ocurre a veces que dos clases en diferentes paquetes tienen el mismo nombre y los necesitamos a los dos.

No es obligatorio que si dos clases tienen el mismo nombre, ambas contendrán las mismas funcionalidades y deberíamos elegir solo una de ellas.

Si necesitamos ambos, entonces no hay daño en usar eso. Y tampoco es una mala idea de programación.

Pero deberíamos usar nombres completos de las clases (que tienen el mismo nombre) para aclarar a qué clase nos referimos también.

:)

2

Si usted tiene su propia clase fecha en que debe distinguirla forman el construido en la clase Date. es decir, ¿por qué creaste la tuya? Algo como ImmutableDate o BetterDate o NanoDate, incluso MyDate indicaría por qué tiene su propia clase de fecha. En este caso, tendrán un nombre único.

6

Otra manera de hacerlo es subclase que:

package my.own; 

public class FQNDate extends Date { 

} 

y luego importar my.own.FQNDate en paquetes que tienen java.util.Date.

+0

Me gusta esto excepto (es simple) sin embargo, no resuelve el problema para acceder a los métodos estáticos. –

+0

Hago esto todo el tiempo cuando quiero usar Hamcrest 'Matchers' y Mockito' Matchers' en la misma clase. Parece que funciona con métodos estáticos. – Kidburla

+0

@Kidburla también puede usar importaciones estáticas siempre que no le importe de qué coincidencia proviene. A menudo hago esto en pruebas unitarias para emparejamientos y '.when's,' .thenReturn's etc. - quita el hinchazón de 'Mockito'. – CptBartender

2

golpeo este problema cuando, por ejemplo, el mapeo de una clase a otra (tal como cuando se cambia a un nuevo conjunto de clases para representar los datos persona). En ese punto, necesita ambas clases porque ese es el objetivo del código: mapear uno con el otro. Y no puede cambiar el nombre de las clases en ningún lugar (una vez más, el trabajo es hacer un mapa, no cambiar lo que otra persona hizo).

Totalmente calificado es de una sola manera. Parece que en realidad no se pueden incluir ambos enunciados de importación, porque Java se preocupa por qué "Persona" quiere decir, por ejemplo.

2

Puede importar uno de ellos mediante la importación. Para todas las demás clases similares, debe especificar nombres de clase totalmente calificados.De lo contrario, obtendrá un error de compilación.

Ej:

import java.util.Date; 

class Test{ 

    public static void main(String [] args){ 

    // your own date 
    my.own.Date myOwndate ; 

    // util.Date 
    Date utilDate; 
    } 
} 
0

sólo tenía el mismo problema, lo que lo hacía, dispuesto el orden biblioteca en secuencia, por ejemplo había java.lang.NullPointerException y javacard.lang.NullPointerException. Hice la primera como biblioteca por defecto y si necesitabas usar la otra puedes especificar explícitamente el nombre completo de la clase.

1

Si realmente desea o necesita utilizar el mismo nombre de la clase a partir de dos paquetes diferentes, tiene dos opciones:

1-escoger uno para usar en la importación y utilizar el nombre completo de la clase del otro:

import my.own.Date; 

class Test{ 

    public static void main(String[] args){ 

     // I want to choose my.own.Date here. How? 
     //Answer: 
     Date ownDate = new Date(); 

     // I want to choose util.Date here. How ? 
     //Answer: 
     java.util.Date utilDate = new java.util.Date(); 

    } 
} 


2-utilizar siempre el nombre de clase completo:

//no Date import 
class Test{ 

    public static void main(String[] args){ 

    // I want to choose my.own.Date here. How? 
    //Answer: 
    my.own.Date ownDate = new my.own.Date(); 
    // I want to choose util.Date here. How ? 
    //Answer: 
    java.util.Date utilDate = new java.util.Date(); 

    } 
} 
No
Cuestiones relacionadas