没有简单的方法在Java中“包含”?

时间:2009-09-13 09:29:24

标签: java import insert include extend

当逻辑上某些东西看起来好像很简单时,它就会变得完全错综复杂,

我没有太多使用Java,所以请原谅我的无知。这是我想要做的:

我在一个.java文件中有一个很好的干净算法,我想从一个初始化的数组中提供它。该数组包含超过40,000个元素,因此我希望它本身就是一个单独的文件。我该怎么做呢?是否真的没有快速的方法来说{在这里插入filename.txt的内容}?

6 个答案:

答案 0 :(得分:10)

File1.java:

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

File2.java:

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

您也可以使用静态导入来使用bigArray,而无需预先File1.

答案 1 :(得分:7)

Java中的基本代码单元是类,而不是文件。导入文件根本没有意义,这是错误的抽象级别。不要考虑文件 - 考虑不同类中的代码以及如何调用该代码。该类定义在哪个文件中(并且它根本不必是文件!)并不重要。

BTW,如果您直接在代码中定义方法,则有40,000个元素可能会遇到方法大小的限制。将数据放入文本文件并解析它会更好。这样,您也不必在更改数据时重新编译任何内容。

编辑:为文件编写解析器的另一种方法是计算一次数据,将其放入适当的Java数据结构(数组,List,Map等),然后序列化使用ObjectOutputStream进入文件。请注意,如果数据存储在稍后更改其签名的类中,则会导致问题。

答案 2 :(得分:1)

制作算法方法static,这样就可以通过Object whateverItReturns = NameOfClass.nameOfStaticMethod(args);

调用它

内容导入通常可以通过多种方式完成,具体取决于您要导出的内容类型以及更新方式,这是选择正确方法的关键。

答案 3 :(得分:1)

不,Java中没有#include工具。从C世界中已知的预处理器没有被包括在内,经过一段时间后,结果是制作出更强大的程序(在我看来)。

您需要创建一个包含所需内容的新类,然后引用它。 Java 6允许静态导入,这使得它几乎透明。

请注意,您可能会冒险达到单个类的最大字节代码大小。我相信它是64 Kb。

答案 4 :(得分:1)

请先阅读Michael Borgwardt的答案,就像我想说的一样。

如果你需要一些素数,你可以在飞行中计算它们:

/** 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]);
}

答案 5 :(得分:0)

Java平台中的故意设计决定是不预处理.java文件。这使事情变得简单,简单就是Java的全部内容。

正如其他人所建议的那样,使用静态导入。有时它感觉有限,但不用调试C风格的宏地狱就好了。