En Python puedes hacer:
from a import b as c
¿Cómo harías esto en Java, ya que tengo dos importaciones que están en conflicto?
En Python puedes hacer:
from a import b as c
¿Cómo harías esto en Java, ya que tengo dos importaciones que están en conflicto?
Respuestas:
No existe un mecanismo de alias de importación en Java. No puede importar dos clases con el mismo nombre y usar ambas sin calificar.
Importe una clase y use el nombre completo para la otra, es decir
import com.text.Formatter;
private Formatter textFormatter;
private com.json.Formatter jsonFormatter;
import [fully-qualified-name] as [ident]
. El “como” no parece palabra clave para caber en Java, así, una alternativa es aproximadamente lo que # usos C: import [ident] = [fully-qualified-name]
.
Como las otras respuestas ya indicaron, Java no proporciona esta característica.
La implementación de esta función se ha solicitado varias veces, por ejemplo, como JDK-4194542: alias de nombre de clase o JDK-4214789: Extienda la importación para permitir el cambio de nombre del tipo importado .
De los comentarios:
Esta no es una solicitud irrazonable, aunque difícilmente esencial. El uso ocasional de nombres totalmente calificados no es una carga excesiva (a menos que la biblioteca realmente reutilice los mismos nombres simples a derecha e izquierda, lo cual es un mal estilo).
En cualquier caso, no pasa la barra de precio / rendimiento para un cambio de idioma.
Así que supongo que no veremos esta característica en Java pronto :-P
Probablemente vale la pena señalar que Groovy tiene esta característica :
import java.util.Calendar
import com.example.Calendar as MyCalendar
MyCalendar myCalendar = new MyCalendar()
import com.example.{Calendar => MyCalendar}
import com.example.Calendar as MyCalendar
.
class MyCalendar extends com.example.Calendar {}
? No es ideal ni bonito, pero debería servir para la mayoría de los propósitos, excepto, por ejemplo, la reflexión. Incluso podría anteponerlo con un comentario si es necesario, como /* import com.example.Calendar as MyCalendar */
.
Hoy presenté un borrador de JEP a OpenJDK sobre esta función de alias. Espero que lo reconsideren.
Si está interesado, puede encontrar un borrador de JEP aquí: https://gist.github.com/cardil/b29a81efd64a09585076fe00e3d34de7
En realidad, es posible crear un acceso directo para que pueda usar nombres más cortos en su código haciendo algo como esto:
package com.mycompany.installer;
public abstract class ConfigurationReader {
private static class Implementation extends com.mycompany.installer.implementation.ConfigurationReader {}
public abstract String getLoaderVirtualClassPath();
public static QueryServiceConfigurationReader getInstance() {
return new Implementation();
}
}
De esa manera, solo necesita especificar el nombre largo una vez, y puede tener tantas clases especialmente nombradas como desee.
Otra cosa que me gusta de este patrón es que puede nombrar la clase implementadora de la misma manera que la clase base abstracta, y simplemente colocarla en un espacio de nombres diferente. Sin embargo, eso no está relacionado con el patrón de importación / cambio de nombre.