W Pythonie możesz wykonać:
from a import b as c
Jak zrobiłbyś to w Javie, ponieważ mam dwa sprzeczne ze sobą importy.
W Pythonie możesz wykonać:
from a import b as c
Jak zrobiłbyś to w Javie, ponieważ mam dwa sprzeczne ze sobą importy.
Odpowiedzi:
W Javie nie ma mechanizmu aliasingu importu. Nie można zaimportować dwóch klas o tej samej nazwie i używać obu bez zastrzeżeń.
Zaimportuj jedną klasę i użyj w pełni kwalifikowanej nazwy dla drugiej, tj
import com.text.Formatter;
private Formatter textFormatter;
private com.json.Formatter jsonFormatter;
import [fully-qualified-name] as [ident]
. „Jak” słowo kluczowe wydaje się nie pasować w Javie, a także alternatywny jest w przybliżeniu jakie używa C #: import [ident] = [fully-qualified-name]
.
Jak już wspomniano w innych odpowiedziach, Java nie udostępnia tej funkcji.
Wdrożenie tej funkcji było wymagane wielokrotnie, np. Jako JDK-4194542: aliasing nazwy klasy lub JDK-4214789: Rozszerz import, aby umożliwić zmianę nazwy importowanego typu .
Z komentarzy:
To nie jest nierozsądna prośba, choć nie jest niezbędna. Sporadyczne użycie w pełni kwalifikowanych nazw nie stanowi nadmiernego obciążenia (chyba że biblioteka rzeczywiście używa tych samych prostych nazw w prawo i w lewo, co jest złym stylem).
W każdym razie nie zmienia poprzeczki cena / wydajność w przypadku zmiany języka.
Sądzę więc, że wkrótce nie zobaczymy tej funkcji w Javie :-P
Prawdopodobnie warto zauważyć, że Groovy ma tę funkcję :
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 {}
? Nie jest idealny ani ładny, ale powinien służyć większości celów bez, powiedzmy, refleksji. W razie potrzeby możesz nawet dodać komentarz z komentarzem /* import com.example.Calendar as MyCalendar */
.
Dzisiaj złożyłem projekt JEP w OpenJDK na temat tej funkcji aliasingu. Mam nadzieję, że ponownie to rozważą.
Jeśli jesteś zainteresowany, możesz znaleźć wersję roboczą JEP tutaj: https://gist.github.com/cardil/b29a81efd64a09585076fe00e3d34de7
W rzeczywistości można utworzyć skrót, aby można było używać krótszych nazw w kodzie, wykonując coś takiego:
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();
}
}
W ten sposób wystarczy tylko raz podać długą nazwę i mieć tyle dowolnych nazwanych klas.
Inną rzeczą, która podoba mi się w tym wzorze jest to, że możesz nazwać klasę implementującą tak samo jak abstrakcyjną klasę podstawową i po prostu umieścić ją w innej przestrzeni nazw. Nie ma to jednak związku ze wzorcem importu / zmiany nazwy.