Устранение неоднозначности в классе, не будучи слишком многословным - PullRequest
1 голос
/ 29 мая 2011

У меня есть библиотека Java, над которой я работаю, со структурой каталогов, которая выглядит следующим образом:

/com
  /example
    /LibX
      Server.java
      Client.java

Теперь, из проекта, использующего вышеупомянутые классы, мне кажется, что импорт com.example.LibX.* и использование Client client = new Client(...); немного двусмысленны, так как «Клиент» может означать что угодно. Поэтому я попробовал следующее, только чтобы получить ошибки «пакет не найден»:

import com.example.*;

LibX.Client client = new LibX.Client(...);

Можно делать то, что я описал? Или есть другой способ устранить неоднозначность без использования com.example.LibX.Client?

Ответы [ 4 ]

3 голосов
/ 29 мая 2011

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

Следующее не является двусмысленным и считается лучшей практикой:

import com.example.LibX.Client;

...

Client client = new Client(...);

В мире, где IDE могут организовать ваш импорт для вас, нет причин не указывать их все в явном виде.

2 голосов
/ 29 мая 2011

Ваша обеспокоенность по поводу неоднозначности не нужна - если у вас есть неоднозначная ссылка, ваш класс не скомпилируется - например,

import java.util.Date;
import java.sql.Date;

public class Test {

        private Date date;
}

не скомпилируется.Так что если вы можете скомпилировать класс, то по определению у вас нет двусмысленной ссылки.

Кстати, LibX.Client немного сбивает с толку.Обычно имена классов пишутся с большой буквы, а имена пакетов в нижнем регистре, поэтому если вы это сделали (если LibX был пакетом верхнего уровня и вы указали полное имя), это больше похоже на внутреннюю ссылку на класс, как в ответе Энди выше.

1 голос
/ 29 мая 2011

Это возможно, если вы хотите сгруппировать клиент и сервер как статические вложенные классы.

public class LibX {
  public static class Client {
    //...
  }

  public static class Server {
    //...
  }
}

Теперь вы можете import mypak.LibX, а затем сделать new LibX.Client(). Это имеет неприятные недостатки: вы вынуждены группировать свои классы, а также создавать дополнительный пустой класс LibX.

0 голосов
/ 29 мая 2011

Нет такого механизма, как то, что вы описали. Ваша единственная другая возможность - использовать импорт одного класса:

import com.example.LibX.Client;
...