5

Изменение имени импорта в Java или импорт двух классов с одинаковым именем

12

Проблема с импортом в Java

В Python можно использовать следующий синтаксис для импорта:

from a import b as c

Однако в Java у меня возникли трудности с импортом двух классов, так как их имена конфликтуют. Как я могу решить эту проблему и импортировать классы таким образом, чтобы избежать конфликта имен?

5 ответ(ов)

7

В Java нет механизма создания псевдонимов для импортов. Вы не можете импортировать два класса с одинаковым именем и использовать оба без указания полного пути.

Импортируйте один класс и используйте полное имя другого, например:

import com.text.Formatter;

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

Сегодня я подал черновик JEP для OpenJDK, посвящённый этой функции алиасинга. Надеюсь, они смогут её пересмотреть.

Если вас это интересует, вы можете найти черновик JEP здесь: https://gist.github.com/cardil/b29a81efd64a09585076fe00e3d34de7.

0

В Java это невозможно сделать. Вам нужно будет использовать полностью квалифицированное имя одного из классов, а для другого класса можно сделать импорт.

0

Это действительно странно, что в Java пока нет подобной функциональности. В Scala это реализовано достаточно легко. В вашем примере вы используете алиасы для импорта классов, что позволяет избежать конфликтов имен и делает код более читаемым.

В Java вы можете использовать полные имена классов, чтобы обойтись без алиасов, но это может привести к довольно "нагруженному" коду. Например:

import com.text.Formatter;
import com.json.Formatter as JsonFormatter; // этого в Java пока нет

Formatter textFormatter = new Formatter();
JsonFormatter jsonFormatter = new JsonFormatter(); // здесь потребуется полное имя класса

Здесь видно, что в Java есть определенные ограничения, которые делают работу с импортами менее гибкой по сравнению со Scala. Это одна из причин, по которой многие разработчики рассматривают возможность перехода на языки с более современными возможностями.

0

Если нет проблем с конструкторами, отличными от стандартных, вы всегда можете сделать так (все мы ждем, когда спецификация языка Java обновится):

public class YaddaYadda
{
    private static class ZU extends eu.zrbj.util.ZrbjUtil_3_0 { }

    public void foo (String s)
    {
        if (ZU.isNullOrEmpty(s))
        {
            // ...

Для использования в проекте класс с 'import' можно разместить в отдельном файле, что обеспечит единое место определения для импорта.

Это, безусловно, спасает, особенно в отношении классов 'библиотеки', т.е. коллекций статических утилитарных функций. Во-первых, это дает возможность версионировать эти классы — как показано в примере — без значительных неудобств для пользователя.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь