Нет простого способа «включить» в Java? - PullRequest
1 голос
/ 13 сентября 2009

Когда логически что-то кажется таким простым, оно оказывается совершенно запутанным

Я не очень много использовал Java, поэтому, пожалуйста, прости мое невежество. Вот что я пытаюсь сделать:

У меня есть хороший чистый алгоритм в одном файле .java, и я хочу получить его из инициализированного массива. Массив содержит более 40 000 элементов, поэтому я хочу, чтобы он был в отдельном файле. Как мне это сделать? Серьезно, нет быстрого способа просто сказать {вставить содержимое файла filename.txt здесь}?

Ответы [ 6 ]

10 голосов
/ 13 сентября 2009

File1.java:

class File1 {
    static int[] bigArray = {1,2,3};
}

File2.java:

class File2 {
    static int main(String[] args) {
        doSomeThingWith(File1.bigArray);
    }
}

Вы также можете использовать статический импорт, чтобы иметь возможность использовать bigArray без указания File1..

7 голосов
/ 13 сентября 2009

Основными единицами кода в Java являются классы, а не файлы. Импортировать файлы просто не имеет смысла, это неправильный уровень абстракции. Перестаньте думать о файлах - подумайте о коде в разных классах и о том, как вы можете вызвать этот код. В каком файле определен класс (и он вообще не должен быть файлом!) Не имеет значения.

Кстати, с 40000 элементов вы можете столкнуться с ограничениями на размер метода, если вы определите их непосредственно в коде. Было бы лучше поместить данные в текстовый файл и проанализировать это. Таким образом, вам также не нужно ничего перекомпилировать при изменении данных.

Редактировать: Альтернативой написанию синтаксического анализатора для файла будет вычисление данных один раз, помещение их в соответствующую структуру данных Java (массив, список, отображение и т. Д.), А затем сериализацию в файл с использованием ObjectOutputStream. Обратите внимание, что это вызовет проблемы, если данные будут храниться в классах, которые впоследствии изменят свою подпись.

1 голос
/ 13 сентября 2009

Пожалуйста, сначала прочитайте ответ Майкла Боргвардта, как и все, что я хотел сказать.

Если вам нужны простые числа, вы можете просто вычислить их на лету:

/** Sieve of Eratosthenes. Return primes <= max */
static Integer[] getSoE(int max) {
    if (max < 1) return new Integer[0];

    BitSet sieve = new BitSet(max / 2);
    ArrayList<Integer> list = new ArrayList<Integer>();
    if (max > 1) list.add(2);
    if (max > 2) list.add(3);

    for (int i = 5, f = 1; i <= max; i += 3 - f, f = -f)
        if (sieve.get(i >> 1) == false) {
            for (int add, j = i + (add = i << 1); j < max; j += add)
                sieve.set(j >> 1, true);
            list.add(i);
        }

    return list.toArray(new Integer[0]);
}

Предполагая, что вы хотите прочитать их из файла:

static Integer[] getPrimeFromFile(String Filename) throws FileNotFoundException {
    ArrayList<Integer> list = new ArrayList<Integer>();

    Scanner sc = new Scanner(new File(Filename));
    while (sc.hasNext())
        list.add(sc.nextInt());
    sc.close();

    return list.toArray(new Integer[0]);
}
1 голос
/ 13 сентября 2009

Нет, в Java нет возможности #include. Препроцессор, известный в мире Си, не был включен, что - через некоторое время - оказывается для создания более надежных программ (на мой взгляд)

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

Обратите внимание, что вы можете рискнуть достичь максимального размера байт-кода одного класса. Я считаю, что это 64 Кб.

1 голос
/ 13 сентября 2009

Сделайте метод алгоритма static, чтобы вы могли вызывать его по Object whateverItReturns = NameOfClass.nameOfStaticMethod(args);

Импорт контента, как правило, может быть выполнен несколькими способами, в зависимости от того, какой именно контент вы хотите экспортировать и как вы хотите обновить его, это ключ к выбору правильного пути.

0 голосов
/ 13 сентября 2009

Это преднамеренное проектное решение на платформе Java - не обрабатывать предварительно файлы .java. Это делает вещи простыми, а Java - это то, что просто.

Как предлагали другие, используйте статический импорт. Иногда это кажется ограничением, но замечательно, что не нужно отлаживать макро-ад в стиле C.

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