2009-07-06 3 views
34

Я новичок и только что узнал, что если я определяю сказатьКакова цель определения пакета в файле Java?

package my.first.group.here; 
... 

затем Java-файлы, которые находятся в этом пакете будут размещены под my/first/group/here каталога.

Какова основная цель размещения некоторых Java-файлов в пакете? Кроме того, если я решил принять это, как мне их группировать?

Спасибо


EDIT: Для тех, кто может иметь один и тот же вопрос, опять же, я только что нашел this tutorial on packages от Солнца

ответ

32

Давайте начнем с определением «Java пакета», как описано в Wikipedia article:

Java, пакет представляет собой механизм для организации классов Java в пространства имен, подобных модули Modula. Пакеты Java могут храниться в сжатых файлах под названием JAR-файлов, , что позволяет классам загружаться быстрее, чем группа, а не одна за раз. Программисты также обычно используют пакеты для организации классов, принадлежащих , к той же категории или предоставляют аналогичную функциональность.

Так на основе этого пакетов в Java просто механизм, используемый для организации классов и предотвращения столкновений имен класса.Вы можете назвать их все, что вы хотите, но ВС опубликовал некоторые naming conventions, что вы должны использовать при именовании пакетов:

Пакеты

Приставка уникального имени пакета всегда пишется во всех -lowercase ASCII и должен быть одним из доменных имен верхнего уровня, в настоящее время com, edu, gov, mil, net, org или одного из двухбуквенных кодов , идентифицирующих стран как специфика ред в стандарте ИСО 3166, 1981.

Последующие компоненты имени пакета варьируются в зависимости от собственных внутренних называющих конвенций, а организации. Такие соглашения могут указать, что определенное имя каталога компонентами являются разделение, отдел, имя проекта, имя машины или имя пользователя.

Примеры:

  • com.sun.eng

  • com.apple.quicktime.v2

  • edu.cmu.cs.bovik.cheese

0

С Wikipedia страницы по теме:

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

4

Это позволяет программе состоять из нескольких разных программ/компонентов/библиотек, так что их имена классов не будут конфликтовать, а компоненты легче организовать. См. http://java.sun.com/docs/books/tutorial/java/package/index.html

В Java принято называть пакеты как обратные доменные имена. Например, если домен вашей компании «initech.com» и вы делаете программу под названием «Gizmo», имена пакетов обычно префикс «com.initech.gizmo», с подпакетами для разных компонентов программы.

2

Пакеты важны для обеспечения гибкости разделения классов. Они могут быть использованы для:

  • отделяющих проектов
  • разделительных модулей
  • разделительных слоев приложений (бизнес, веб, дао)
  • дополнительно мельче зернистого разделение кода

Например

com.mycompany.thisproject.thismodule.web

Может указывать на веб-слой некоторого модуля.

10

Я большое приложение, вы должны иметь два файла с одинаковым именем (java.util.Date и java.sql.Date), особенно когда вы начинаете привлекать сторонние банки. Таким образом, вы можете использовать пакеты для обеспечения уникальности.

Самое главное, на мой взгляд, упаковка разбивает проекты на значимые сегменты. Таким образом, мой SQL-пакет имеет код, связанный с sql, и мой логгер-пакет обрабатывает протоколирование.

+1

«... вы можете использовать пакеты для обеспечения уникальности ....» точно в порядке. Термин highfaluting - это «разделение глобального пространства имен». Ваша цитата java.util.Date и java.sql.Date - это место. – duffymo

0

также, если я решил принять это, как следует сгруппировать их?

Это во многом зависит от дизайна (-ов), который вы будете использовать в своем проекте.По большей части (особенно, если вы новичок), вы захотите сгруппировать их по функциональности или с помощью другого логического подобия.

+0

Кроме того, я бы добавил, что «выбор для принятия» на самом деле не вариант, «должен принять» - это больше реальность. Как правило, оставляя классы в пакете «по умолчанию», неодобрительно. – cjstehno

0

Java очень точен в своей реализации. На самом деле это не оставляет места для потасовки.

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

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

У вас могут быть разные объекты «Точка», определенные в 4 разных местах вашей системы, но ваш класс будет использовать только тот, который вы ожидаете (потому что вы импортируете его).

То, как они гарантируют, что каждый человек имеет собственное пространство, должен использовать ваш обратный домен, поэтому мой «tv.kress.bill». Я владею этим доменом. Фактически, я разделяю его с моим братом «tv.kress.doug», и хотя мы разделяем один и тот же домен, мы не можем столкнуться.

Если в вашей компании развиваются сотни подразделений в вашей компании, они могут делать это без столкновений и точно знать, как их разделить.

Системы, которые не выполняют такого рода деления, кажутся мне действительно шелушащимися. Я мог бы использовать их, чтобы взломать скрипт для чего-то личного, но мне было бы неудобно создавать что-либо большое без какой-либо строгой упаковки.

0

Другие люди предоставили очень специфичные для Java ответы, но это аналогия: зачем вы упорядочиваете файлы в каталогах на вашем жестком диске? Почему бы просто не иметь плоскую файловую систему со всем в одном каталоге?

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

Как и каталоги, он также предоставляет способ разрешения конфликтов имен. Вы можете иметь temp.txt в нескольких разных каталогах таким же образом, что вы можете иметь два класса, которые отображаются в разных пакетах. Это становится важным (1), когда вы начинаете комбинировать код с другими людьми в Интернете или (2) даже понимаете, как работает классная загрузка Java.

0

Еще одна важная вещь в пакетах - это элемент protected для контроля доступа.

Защищено где-то между публичными (каждый может получить доступ) и частным (доступ только для внутреннего класса). Вещи, помеченные как защищенные, могут быть доступны из одного и того же пакета или из подклассов. Это означает, что для ограниченного доступа вам не нужно класть все в один класс.

3

В дополнение к пространству имен, упомянутому в других ответах, вы можете ограничить доступ к методам и полям на основе области, объявленной этим членом. Члены с общественностью область действия свободно доступны, чтобы ограничить доступ, вы обычно определяете их как частный (т. Е. Скрытый вне класса). Вы также можете использовать область , чтобы ограничить доступ к типу и его детям. Существует также по умолчанию scope (член без квалификатора имеет область по умолчанию), которая позволяет дочерним типам и типам в том же пакете обращаться к члену.Это может быть эффективным способом совместного использования полей и методов, не делая их слишком широко доступными и может помочь в тестировании.

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

public class Foo { 
    int doSomething() { 
     return 1; 
    } 
} 

Для проверки метода можно определить другой тип в том же пакете (но возможно другое расположение источника), этот тип будет иметь возможность доступа к методу.

public class FooTest { 
    @Test 
    int testDoSomething() { 
     Foo foo = new Foo(); 
     assertEquals(1, foo.doSomething()); 
    } 
} 
1

В конечном счете, есть 3 основных причины, по которым мы хотим использовать пакеты на Java.

1) Легче обслуживание

Организация classes в packages следует разделение задач принципа герметизацией и позволяет лучше сплочения в общей конструкции системы. Двигаясь дальше, упаковка по характеристикам позволяет командам разработчиков находить соответствующие классы и интерфейсы для внесения изменений, поддерживая методы вертикальной резки для масштабированных подходов, используемых в гибкой методологии. Для получения дополнительной информации см. Запись в блоге: Package your classes by Feature and not by Layers и Coding: Packaging by vertical slice.

2) Обеспечение безопасности пакета

Пакеты позволяют внешний доступ только public модификаторы доступа по методам, содержащихся классов. Использование модификатора protected или без него будет доступно только для классов в одном пакете. Для получения дополнительной информации см сообщение: Which Java access modifier allows a member to be accessed only by the subclasses in other package?

3) избежать подобных имен

Подобно пространства имен .NET, имена классов содержатся в пределах их содержащего пакет. Это означает, что два взаимоисключающих пакета могут содержать классы с тем же именем. Это связано с тем, что сами пакеты имеют разные имена, и, следовательно, имена полностью различаются. Для получения дополнительной информации см. Учебник [Именование пакета: Учебники Java] [3].

Смежные вопросы