Как вы #include файлы в Java? - PullRequest
       1

Как вы #include файлы в Java?

9 голосов
/ 12 октября 2011

Исходя из среды C ++, я привык разбивать многие нужные мне функции на файл funcs.h, затем делать #include "funcs.h", а затем добавлять прототипы функций в основной файл .cpp. Теперь я начинаю работать с Java (в основном с Minecraft ModloeaderMp), и я уже создал файл funcs.java, в котором есть некоторые готовые функции (например, некоторые функции для копирования файлов, предоставления стопок элементов и т. Д.). Так как я уже использую оператор Public class mod_mine extends BaseModMp, есть ли способ, которым я могу импортировать функции, или я могу просто сделать еще один Public class mod_mine extends funcs?

Ответы [ 7 ]

19 голосов
/ 12 октября 2011

Вы не #include в Java, вы import package.Class.Начиная с Java 6 (или это было 5?), Вы также можете import static package.Class.staticMethodOfClass, что позволило бы получить некоторые формы того, что вы пытаетесь сделать.Вы систематически добавляете к префиксам импортированных имен классов имя пакета или имена импортированных статических методов с пакетом и именем класса.Фактическая семантика #include не существует в Java - вообще.

Тем не менее, наличие файла "funcs.java" мне кажется, что вы начинаете погружать свои пальцы в некоторые анти-паттерны... И ты должен держаться подальше от них.

9 голосов
/ 12 октября 2011

В Java нет #include.

Мне бы не хотелось, чтобы в проекте был funcs.java, в котором были бы сохранены все переменные.Объекты - это состояние и поведение, заключенные в единый компонент.Вы не проектируете объектно-ориентированный способ, если делаете это.

Хорошие имена имеют значение.Класс с именем Stuff, который расширяет Stuff2, должен быть просто плохим примером.

Это не хорошая Java.Я бы тоже не посчитал это хорошим C ++.

3 голосов
/ 12 октября 2011

Java - это объектно-ориентированный язык программирования, и для этого есть причина.

В java нет #include, хотя вы можете импортировать классы из других пакетов.Создание отдельного класса func.java для хранения переменных может быть не очень хорошей идеей, до тех пор, пока все они не являются константами.Расширяя некоторый класс, вы можете повторно использовать функцию.но продлевает ли класс прохождение теста IS A, если нет, то это может быть плохой идеей.

Если вы переходите с C ++, изучите хорошую книгу, например, Head First, Java может очень помочь.

3 голосов
/ 12 октября 2011

Похоже, вы помещаете все свои методы в один класс.Вы должны разделить их:

служебные классы

Они должны содержать статические методы, которые выполняют такие вещи, как получение содержимого файла, отображение диалогового экрана или добавление двух чисел.все вместе.Они на самом деле не принадлежат к объектному классу, им не требуются экземпляры, и они широко используются в программе.См. java.lang.Math для хорошего примера этого.

Постоянный класс или файлы конфигурации

Это может быть Constants класскоторый содержит static final членов, таких как PI = 3.1415.Вы можете получить к ним доступ, используя Constants.PI.

. Или вы можете использовать файлы конфигурации и загрузить их в Configuration и получить доступ к переменным конфигурации с помощью чего-то вроде config.get("database")

Other

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

2 голосов
/ 12 октября 2011

В java нет #include. Вы можете использовать оператор import, чтобы сделать классы и интерфейсы доступными в вашем файле.

0 голосов
/ 11 декабря 2018

Вы можете запустить препроцессор C для файла Java, убедившись, что вы используете флаг -P для отключения примечаний к строкам. Быстрый поиск в Google подтверждает, что эта попытка предпринималась как минимум дважды, и даже используется в популярной библиотеке fastutil :

Это работает для всех директив (#include, #define, #ifdef и т. Д.) И синтаксически и семантически идентично эквивалентным операторам в C / C ++.

0 голосов
/ 23 июля 2015

На самом деле ... Есть способ иметь ту же семантику, что и в C #include (позднее ключевое слово было заимствовано в C ++ для того, чтобы выглядеть причудливо ...). Он не определен одними и теми же словами, но делает именно то, что вы ищете.

Сначала давайте посмотрим, что вы делаете с #include в C ++, чтобы понять вопрос:

  • включает #defines,
  • определения "прямой" функции (их "тело" определяется в другом месте, в реализации класса, если вы помните Turbo Pascal, вы поймете мою точку зрения),
  • определить структуры,

и это почти все.

Для определений структуры нет смысла, это старая школа C: в C ++ вы больше не определяете struct {} веками, вы определяете class структуры со свойствами и методами доступа, то же самое в Java : здесь нет typedef struct {}.

Для этого у вас есть объявление "interface", см. https://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html

Это именно то, что вы ищете:

    public interface MyDefines {
        final CHAR_SPACE : ' ';               // ugly #define
        int detectSpace(FileInputStream fis); // function declaration
        // and so on
    }

Затем использовать:

    public class MyClass extends MyAncestor implements MyDefines {
        ...
        // implementation of detectSpace()
        int detectSpace(FileInputStream fis) {
            int ret = 0;
            char Car;
            if((Car = fis.read()) != -1) && (Car == CHAR_SPACE)) ret++;
            ...
        }

Прочитайте приведенную выше ссылку, она полна полезных случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...