Змініть імпорт імпорту на Java або імпортуйте два класи з тим самим іменем


363

У Python ви можете:

from a import b as c

Як би ви це зробили на Яві, оскільки я маю два імпорти, які стикаються.


19
Я б хотів, щоб ява зробила це. Веде до занять з незручними іменами.
fncomp

2
@fncomp: ..і безладний код з великою кількістю повністю кваліфікованих імен класів: P
Superole

2
У Java 12 цього ще немає
Janac Meena

Відповіді:


463

У Java немає механізму імпортування імпорту. Ви не можете імпортувати два класи з однаковим іменем і використовувати обидва класи некваліфіковано.

Імпортуйте один клас і використовуйте повністю кваліфіковане ім'я для іншого, тобто

import com.text.Formatter;

private Formatter textFormatter;
private com.json.Formatter jsonFormatter;

16
Це правильна відповідь, і до цього я додав би лише те, що ви мали на увазі: ні, у Java немає такого синтаксису згладжування.
Шон Оуен

19
Це все-таки обмеження в Java 8?
HairOfTheDog

8
@HairOfTheDog Nope, на жаль, не додано ім'я імпортування в Java8
AdrieanKhisbe

12
Так, я згоден з вашим коментарем linuxdan ... Java пішла шляхом динозавра з точки зору оновлень його синтаксису.
Кевін Паркер

6
@Bozho Шлях пітон робить: import [fully-qualified-name] as [ident]. «Як» ключове слово , здається, не вписується в Java , а також, альтернатива приблизно те , що # використовує C: import [ident] = [fully-qualified-name].
Даніель Н

60

Як і інші відповіді, вже зазначені, Java не забезпечує цю функцію.

Реалізацію цієї функції запитували неодноразово, наприклад, як JDK-4194542: псевдонім імені класу або JDK-4214789: Розширити імпорт, щоб дозволити перейменування імпортованого типу .

З коментарів:

Це не необгрунтований запит, хоча й навряд чи істотний. Епізодичне використання повнокваліфікованих імен не є надмірним тягарем (якщо тільки бібліотека дійсно не використовує одні й ті ж прості імена праворуч і ліворуч, що є поганим стилем).

У будь-якому випадку він не проходить планку ціни / продуктивності для зміни мови.

Тому я думаю, що ми не побачимо цю функцію на Java незабаром :-P


15
Оце Так! ви не жартували про "не (...) незабаром", я бачу, що запит на функцію був відхилений як безглуздий цукор ще в 1998 році! І кожна спроба відновити дискусію протягом цих останніх 18 років опиралася на посилання на це давнє рішення. Я думаю, було б легше переконати розробників IDE реалізувати це як маску в редакторі, ніж намагатися збити сенс в Oracle.
Superole

2
Однак старі міркування вірні - на практиці ці сутички трапляються дуже рідко.
стрункий

14
Я не згоден, що ці сутички трапляються рідко. Орієнтація об'єкта сприяє простому іменуванню. Я можу мати співробітника класу з двох різних бібліотек, які роблять окремі речі із працівником (наприклад).
Андрій Епуре

6
@slim " на практиці ці сутички трапляються дуже рідко ". Не ясно, чому ж усе відбуватимуться рідше в Java (де ви можете мати 10.000+ класів) , ніж на інших мовах (де ви зазвичай маєте менше класів) , які роблять підтримують цей «цукор» синтаксис.
Ален Паннетьє

21
Абсолютно неправильно. Я стикаюся з дуже простим сценарієм, який, мабуть, є дуже поширеним і де цей синтаксичний цукор був би дуже корисним. Переклад між спорідненими, але виразними об'єктними моделями (використовуються у споріднених, але різних продуктах відповідно), класи яких більшість часу мають одне й те саме ім'я. Процес перекладу вимагає від вас посилатися на обидва класи в одному блоці коду. У такому випадку (який повинен бути дуже поширеним), Java ускладнює життя. Якраз кількість переглядів цієї публікації повинна розповісти вам історію.
hrshi1990

59

Напевно, варто відзначити, що Groovy має таку особливість :

import java.util.Calendar
import com.example.Calendar as MyCalendar

MyCalendar myCalendar = new MyCalendar()

15
У Scala це:import com.example.{Calendar => MyCalendar}
pablisco

24
А в Котліні : import com.example.Calendar as MyCalendar.
КевінО

14
У PHP це: використання COM \ приклад \ Calendar , як MyCalendar
matang

19
Дуже прикро бачити, що (принаймні) 3 мови на базі JVM (Groovy, Scala & Kotlin) мають цю функцію, але сама Java все ще не має ...
Маттіас

2
Що про щось подібне class MyCalendar extends com.example.Calendar {}? Це не ідеально чи симпатично, але воно повинно слугувати більшості цілей, окрім, скажімо, роздумів. Ви навіть можете додати його до коментаря, якщо потрібно, наприклад /* import com.example.Calendar as MyCalendar */.
Бреден Кращий

21

Java не дозволяє вам це робити. Вам потрібно буде посилатися на один із класів за його повною мірою, а лише імпортувати інший.



-4

Насправді можна створити ярлик, щоб ви могли використовувати короткі імена у своєму коді, зробивши щось подібне:

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();
    }
}

Таким чином вам потрібно лише один раз вказати довге ім’я, і ви можете мати стільки спеціально названих класів, які вам потрібно.

Ще одна річ, яка мені подобається в цьому шаблоні - це те, що ви можете назвати клас реалізації таким же, як абстрактний базовий клас, і просто розмістити його в іншому просторі імен. Це, однак, не має відношення до моделі імпорту / перейменування.


18
Це дуже бідне рішення. Він повністю не справляється зі статикою, може потребувати постійних оновлень і не допомагає при проблемах де / серіалізації (наприклад, десеріалізації з xml через jaxb).
інженер програмного забезпечення
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.