Главная » Java » Импорт типов

0

 

  Об имени типа, в которое включен префикс названия пакета, отделенный имволом точки, говорят как о полном имени (fully qualified name) типа. Например, полным именем класса String является Java, lang. Stri ng. При написании кода, которому необходимо обращаться к членам определенного пакета, возможно использовать два альтернативных подхода. Один из них состоит в употреблении полного имени нужного типа. Он удобен, если вашей программе нужно только несколько элементов пакета, но если учесть, что имена пакетов бывают достаточно длинными (пусть даже и не очень длинными, как у стандартных пакетов), неоднократное задание полного имени типа может оказаться достаточно утомительным занятием.

   Другой подход связан с импортом (import) всего пакета или определенной его части. Программист, которому необходимы средства пакета attr, вправе поместить в верхней части текста с исходным кодом (после объявлений package, если таковые имеются, но перед любыми другими строками) следующую инструкцию импорта:

  import  attr.*;

Теперь для ссылки на типы, принадлежащие пакету attr, можно использовать простые имена — как, например, Attributed. Команду импорта, в которой используется символ звездочки (*), называют объявлением импорта по требованию (import on demand). Можно воспользоваться также инструкцией импорта единственного типа (single type import), имеющей следующий вид:

import attr.Attributed;

   Процедура импорта кода, принадлежащего текущему пакету, выполняется неявно, поэтому любые типы пакета допускают непосредственное обращение из кода других типов, объявленных в том же пакете. Пакет Java, lang импортируется в любой код автоматически.

   Механизм импорта пассивен — в том смысле, что он не подразумевает, что информация об упомянутом пакете и принадлежащих ему типах должна принудительно считываться на этапе компиляции (если только компоненты типа не используются в тексте). Инструкция импорта просто уведомляет компилятор о том, каким образом он может определить полное имя типа, применяемого в программе, если определение этого типа не будет найдено в текущем файле. Если, например, некий класс содержит ссылку на тип Attributed, компилятор осуществит поиск объявления этого типа, руководствуясь схемой проверки следующих контекстов (мы говорили о ней в разделе 6.5 на странице 170):

1) объявлений текущего типа и унаследованных типов;

2) объявлений типов, вложенных в текущий;

3) явно указанных импортированных типов (импорт единственного типа);

4) других типов, объявленных в том же пакете;

5) неявно заданных импортированных типов (импорт по требованию).

Если в процессе поиска объявление типа так и не было найдено, ситуация трак-тУется как ошибочная.

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

главе 5, например, мы рассматривали пример класса BankAccount, содержащего вложенный класс Permissions. Если разместить эти классы в пакете bank и выполнить команду import bank.BankAccount, при дальнейшем обращении к классу Ре rmi s s i on 5 придется пользоваться полным именем BankAccount. Permi ssions. Вместо этого можно включить в текст инструкцию import bank. BankAccount, Permi ssions — это даст возможность ссылаться на вложенный класс просто как на Permissions. Вообще говоря, применение инструкций явного импорта вложенных типов приводит к сокрытию информации об их истинной природе — поэтому подобных соблазнов следует избегать.

   Механизмы package и import предоставляют программисту средства контроля над ситуациями, связанными с возможными конфликтами имен. Если, например, пакет, используемый для решения задач другой предметной области, такой как лингвистика, также содержит класс Attributed, служащий для определения атрибутов естественных языков, и программисту необходимо пользоваться одновременно двумя типами с одинаковыми именами, в его распоряжении имеется несколько альтернатив дальнейших действий:

- ссылаться    на   все    типы,    используя    их    полные    имена,    такие    как

attr.Attributed и lingua.Attributed;

- импортировать только  один  пакет,  указав  имя  attr.Attributed  либо

attr.’v, а затем для ссылки на attr .Attri buted пользоваться простым

именем Attributed и употреблять полное имя, lingua. Attri buted, при

обращении к одноименному классу;

- наоборот, импортировать другой пакет, указав имя lingua. Attri buted либо

lingua.*, а затем для ссылки на lingua. Attri buted пользоваться простым

именем Attributed и употреблять полное имя, attr.Attri buted, при обра

щении к одноименному классу;

- импортировать оба пакета,  attr,ft  и  lingua.*,  и использовать в коде

полные имена классов, attr.Attributed и lingua.Attributed; если в

двух пакетах, импортируемых по требованию, существуют объявления ти

пов с одним и тем же именем, использовать при обращении к ним простые

имена запрещено.

   Будет ошибкой импортировать некоторый тип, который существует и как тип верхнего уровня (т.е. не вложенный) в текущем исходном файле. Например, нельзя объявить собственный класс Vector и одновременно задать инструкцию импорта класса Java.utiI .Vector. Запрещается также импортировать командами импорта единственного типа одноименные типы, принадлежащие различным пакетам. Как говорилось выше, если два типа с одним именем неявно импортируются по требованию, для доступа к ним нельзя пользоваться простыми именами и следует задавать полные — в противном случае код будет воспринят как неоднозначный и вызовет ошибку компиляции.

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии