Каково значение обратного доменного имени для структуры пакета Java

Почему мы используем обратное доменное имя, такое как com.something. или орг.что-то. структура для java-пакетов? Я понимаю, что это вносит какую-то уникальность, но зачем нам эта уникальность?


person Vaishak Suresh    schedule 19.03.2010    source источник
comment
Это на самом деле больше соответствует соглашению, в котором слева направо движется от общего к частному — подумайте о путях к файлам или десятичной системе Дьюи. Вы могли бы, наоборот, спросить, почему доменные имена нарушают это соглашение (или почему мы записываем даты так, что это неблагоприятно для сортировки).   -  person harpo    schedule 19.03.2010
comment
@harpo: Верно. Доменные имена и даты лучше писать наоборот.   -  person Leo Jweda    schedule 19.03.2010
comment
Синтаксис server.domain.tld — это очень англоязычный способ выражения вещей (модификаторы перед объектом — красный шар). Испанский, например, имеет более логичный синтаксис модификатора объекта (bola roja).   -  person dlchambers    schedule 02.07.2021


Ответы (6)


Глобально уникальные имена пакетов позволяют избежать конфликтов имен между библиотеками из разных источников. Вместо создания новой центральной базы данных глобальных имен используется реестр доменных имен. Из JLS:

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

person Laurence Gonsalves    schedule 19.03.2010
comment
DNS действительно не имеет к этому никакого отношения (все равно +1) - person Fredrik; 19.03.2010
comment
@Fredrik поиск DNS на самом деле не выполняется, но широко известный реестр уникальных имен, на который ссылается JLS, является системой доменных имен. - person Laurence Gonsalves; 19.03.2010

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

accounting.mycompany.org
graphics.mycompany.org

Затем это подразумевает наличие основного пакета accounting, подраздел которого предназначен для mycompany, а подраздел этого пакета называется пакетом org, который вы фактически используете. Тем не менее, вы хотите это:

org.mycompany.accounting
org.mycompany.graphics

Это имеет больше смысла. Из всех пакетов от организаций (org) обратите особое внимание на mycompany, и у него есть два подпакета, accounting и graphics.

person Claudiu    schedule 19.03.2010
comment
+1. Обратите внимание, что (к сожалению?) Java не поддерживает подпакеты. Подпакет не ближе к своему родителю (с точки зрения видимости), чем совершенно не связанный с ним пакет. Конечно, это все еще полезно для целей организации кода. - person Thilo; 19.03.2010
comment
Это только подразумевает, что org является конкретным пакетом, потому что вы на самом деле не выполняете свой пример полностью. Что, если первая часть — это конкретный пакет? Это было бы невозможно? -1 Строман, страны, читающие справа налево, не согласились бы прямо здесь: P - person sinni800; 12.09.2013
comment
@sinni800: -1 к твоему комментарию. когда вы пишете код на Java, он пишется слева направо. Кроме того, когда у вас есть a.b.c.d, это означает, что вы начинаете с класса a, вкладываете в его поле b, вкладываете в c этого поля, а затем вкладываете в d этого поля. Аналогично организация пакетов должна работать так же. Кроме того, в пакетах Python подупаковка выполняется так, как я написал здесь. Так что это было бы не невозможно, но было бы глупо. - person Claudiu; 12.09.2013
comment
@Claudiu Но есть некоторые части языка (унаследованные от синтаксиса в стиле C), где, хотя есть чтение слева направо, есть стиль справа налево (с точки зрения слов, а не символов. Для примеры определений функций. Тип возвращаемого значения стоит на первом месте, хотя, как человек, вы бы не поставили это на первое место.). Я просто пытаюсь сказать, что не существует универсальной истины о том, что подпакеты должны идти слева направо. Однако я не знал о питоне. - person sinni800; 12.09.2013
comment
@sinni800: хм, ну да, все дело в соглашении. хотя левое-›правое является общим, более конкретное встречается довольно часто... можете ли вы назвать какие-либо языки программирования, которые имеют пакеты и не делают это слева направо? - person Claudiu; 12.09.2013
comment
@Claudiu Я не могу, извини. Это была просто мысль и попытка вырвать немного из привычного мышления. Но Golang, например, с внешними пакетами использует hostname/project. github.com/youruser/yourproject, например. Они разделяются не по частям имени хоста, а скорее по фактическому имени хоста, а не по имени проекта. Golang действительно многому меня научил в этих вещах, и это отклонение от обычного синтаксиса C: var name string, func name(parameters) returnType... - person sinni800; 13.09.2013
comment
@sinni800: я использовал Haskell, который также имеет объявления типов, как вы сказали (foo :: Int -> Int означает, что foo имеет тип функции, которая принимает целое число и возвращает целое число). я вижу, что это работает в любом случае. но хорошо, подумайте об этом - скажем, у вас есть пакеты в том порядке, который вы предложили, на Java. таким образом, accounting.project — бухгалтерская часть project, а reporting.project — отчетная часть project. теперь у вас есть класс в каждом, accounting.project.AccountManager и reporting.project.ReportGenerator... разве это не выглядит неправильно? Это смешивание двух условностей в одном - person Claudiu; 13.09.2013
comment
@sinni800: или, если у вас есть подклассы, account.project.AccountManager.FooBit против reporting.project.ReportGenerator.ReportingSubsystem. теперь левая половина имени специфично-›родовая, а правая половина родово-›специфичная. Я мог бы видеть, как это работает так, как вы сказали, если бы синтаксис для доступа к полям также работал, добавляя элементы слева, но в Java это не работает. - person Claudiu; 13.09.2013
comment
@Claudiu Хорошо, а что, если мы попытаемся немного изменить это ... account.project::AccountManager (это все еще выглядит ужасно, но различие уже здесь) ... Все может иметь решение, но то, которое вы предложено на самом деле нет. Я никогда не хотел предлагать что-то подобное, если честно. - person sinni800; 13.09.2013
comment
давайте продолжим это обсуждение в чате - person Claudiu; 13.09.2013
comment
Это имеет больше смысла, если вы раньше не пользовались Интернетом. В этом случае это излишне педантично. - person Erik Aronesty; 06.09.2018

Как вы говорите, обратные доменные имена в качестве имени базового пакета обеспечивают уникальность. Предположим, что две компании с DN example.com и example.org определяют класс Employee в своей структуре. Теперь, если вы используете обе платформы, вы не сможете точно определить, какого сотрудника вы хотите использовать в своем коде, но если они определены в пакетах com.example и org.example соответственно, вы можете указать компилятору/JVM, какой именно класс вы используете ссылаясь на. Если уникальные пакеты не определены, вы получите ошибки компиляции или ошибки времени выполнения, например. если вы используете класс сотрудников com, но класс сотрудников org загружается первым из пути к классам, вы получите ошибку времени выполнения, поскольку два класса сотрудников могут иметь разную структуру.

person saugata    schedule 19.03.2010

Уникальность необходима для загрузки классов.

Это помогает избежать конфликтов имен. Если есть классы с одинаковым именем пакета и именем класса, при попытке загрузить классы произойдет конфликт.

Обычно это происходит, если имеется несколько библиотек (jar), содержащих классы с одинаковыми именами.
< br> См. также это.

person Padmarag    schedule 19.03.2010
comment
О какой нагрузке вы говорите? и как его уникальное имя предотвращает возможное столкновение? Я предполагаю, что любой конфликт, возникающий во время загрузки, возникает, если имя класса также совпадает. - person Vaishak Suresh; 19.03.2010
comment
@Vaishak: это предположение неверно. Уникальное имя, идентифицирующее класс, — это пакет + имя класса. Если вы находитесь в том же пакете или если вы специально импортировали пакет или полное имя класса, вы можете использовать только это имя. Как и при наборе номера телефона, вам обычно не нужно указывать код города, если вы уже находитесь в том же городе, но полный номер телефона, который вы раздаете, все равно будет включать код города. - person Fredrik; 19.03.2010
comment
@Fredrik Мое предположение соответствовало вашему объяснению :) Вот почему я сказал, что конфликт возникает, если имя класса тоже такое же. Но на мой вопрос теперь есть ответ. Спасибо! - person Vaishak Suresh; 19.03.2010

Вам нужна уникальность, если вам может понадобиться интегрировать свой код со сторонним программным обеспечением или предоставить его кому-то еще для интеграции. Если вы не будете следовать правилам, вы увеличите риск того, что в какой-то момент у вас возникнет коллизия имен классов, и вам придется переименовать множество ваших классов, чтобы решить эту проблему. Или, что еще хуже, вашим клиентам придется переименовывать код.

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

person Stephen C    schedule 19.03.2010

Как вы сказали, это приносит уникальность, что особенно необходимо при работе со сторонним кодом. Например, предположим, что вы используете библиотеку, которую я сделал. Я использовал пакет "foo" и там есть класс с именем Bar. Теперь, если вы также используете имя пакета «foo» И у вас есть класс с именем Bar, это будет означать, что ваша реализация переопределит мою реализацию Bar, сделав мою реализацию недоступной. С другой стороны, если бы мой пакет был "com.mydomain.foo" и у меня был класс Bar, то вы могли бы свободно использовать имя Bar в одном из ваших классов, и оба класса по-прежнему могли бы быть однозначно идентифицированы и использоваться по отдельности. .

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

person Kim L    schedule 19.03.2010