Отдельные файлы для определения класса и объявления в Java

Я программист на С++, изучающий Java, и мне интересно, следует ли ООП в Java следовать тому же принципу разделения определения класса и объявления, как это делает С++. поместите их как в отдельные файлы. Я просмотрел интернет, включая веб-сайт разработчика Android, и весь код, с которым я столкнулся, имеет определение и объявление, выполненные одновременно.

Разве это просто одно из отличий между разработкой в ​​С++ и разработкой в ​​Java, или же источники, на которые я смотрел, просто делали так, чтобы ограничить сложность своего кода для публикации в Интернете? Я видел декларации и определения, объединенные в некоторых документах на С++, хотя я знаю, что это плохая практика.

Ответ 1

Существует практическая причина для разделения декларации в С++, и это позволяет скомпилировать исходные файлы отдельно. В Java нет такой необходимости (поскольку все скомпилировано для байт-кода отдельно), поэтому это не разрешено.

Ответ 2

Следующий ответ был отредактирован в значительной степени на основе комментариев.

Вам не нужно разделить свой класс на определение и декларацию исключительно для компилятора, так как нет необходимости в форвардных объявлениях в Java (как есть в С++). Вы можете разделить определение класса и объявление на пару интерфейса/класса (или пару [abstract] class/class) из-за требований к дизайну, например:

  • Несколько классов, реализующих один интерфейс.
  • Удаленные вызовы процедур, в которых вы не хотите раскрывать какие-либо зависимости вашего класса (поскольку они могут быть недоступны на стороне клиента)
  • Класс, который используется другими классами, но вам не нужно/нужна его полная функциональность при тестировании (например, служба доступа к базе данных, которую вы можете высмеять в своем тестовом коде).

Однако это более похоже на использование виртуального базового класса и конкретных классов реализации на С++ и часто называется "программированием для интерфейса". Вы можете подробнее прочитать технику в этой статье (с некоторыми аргументами, почему вы можете предпочесть использовать абстрактный класс вместо интерфейса в качестве базы). Кроме того, такое расщепление следует рассматривать осторожно; во многих случаях расщепление класса является просто излишним излишеством и приведет к ненужному раздуванию кода.

Таким образом, короткий ответ таков: вам не нужно разделить класс только для того, чтобы иметь объявление вперед (которое задает исходный вопрос), хотя вы можете сделать это, если есть причина дизайна ( но это не эквивалент разделения файлов заголовка/класса С++).

Ответ 3

В Java у вас нет выбора: имя класса связано с именем файла. Для файла с именем x/y/z/T.java из корня исходных файлов T.java должен выглядеть следующим образом:

package x.y.z;

[some modifiers here] class T {
     // class T here
}

Есть способы отделить "определение класса" от "реализации", наиболее близким к тому, что вы имеете в виду, это объявление интерфейса I и реализация класса C I. Также рассмотрим абстрактные классы.

Интерфейс имеет то же самое ограничение, за исключением того, что вы объявляете interface вместо class. Абстрактный класс - это просто класс с модификатором abstract.

Ответ 4

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

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

Ответ 5

В Java нет заголовков и исходных файлов, как у вас на С++. Если вы хотите отделить объявление класса от его реализации, вы можете определить интерфейс, который объявляет методы, а затем создать класс, реализующий интерфейс.

Ответ 6

Разделение, о котором вы пишете, не существует в Java. Вы можете разделить определения методов (нестатические) на interface.

Ответ 7

Нет, такого разделения нет в java. Но посмотрите на ключевое слово интерфейса. вы можете явно объявлять интерфейсы!