【问题标题】:How to do something similar to an include in C?如何在 C 中做类似于包含的事情?
【发布时间】:2011-07-02 08:44:46
【问题描述】:

请原谅我的无知,但我是使用结构化编程的 java 初学者,我不知道如何做类似的事情以包含在 c、php 或其他类似语言中。

我有一个包含一个很大数组的主类。我想知道如何将数组分离到另一个文件或类中,并在主类中包含类似的东西来使用这个数组

我想在文件或外部类中初始化数组,然后从主类调用度假村。

我该怎么做?谁能发个例子?

谢谢!

【问题讨论】:

  • 您是出于美学原因(即具有较小的源文件)还是出于性能原因(出于例如,避免在你的类的每个实例中都有一个大的数组副本)?在第一种情况下,下面 Alain Pannetier 的想法相当不错。如果是出于性能原因,请考虑只创建数组static,以便实例化它的一个副本。
  • 您可能应该使用List不是现代(1998 年后)Java 的数组。
  • 这是你说的第一个原因,为了更小的源代码和美观。谢谢!

标签: java import include


【解决方案1】:

您可以在自己的类中将数组定义为公共静态最终数组,并从任何其他类访问它。

public class MyArray {
    public final static String [] myArray = { "one", "two", "three" } ;
}



public class MyMain {
    public static void main(String[] args) {
        for (String s : MyArray.myArray ) {
            System.out.println( s );
        }
    }
}

【讨论】:

  • 如果这两个类属于不同的包,则必须考虑导入。
【解决方案2】:

您可能知道,在 C 中,#include <file.h> 指令只是将file.h 的全部内容粘贴到当前源文件中。 file.h 通常只包含在file.c(或其他名称不相关的文件)中定义的函数声明,以及struct 声明和#defines。然后编译器在不知道头文件中声明的函数的实际实现的情况下编译当前源文件。编译后,链接器会在其他编译文件中找到实际实现,并将您的编译文件连接到它。

在 Java 中,编译器本身能够在其他文件中查找定义;因此,不需要头文件。相反,每个文件都将自己声明为 package 的一部分,并且每个文件通常包含一个 class(并且所有方法(与 C 中的函数相同)必须驻留在类中)。在每个文件的顶部,可以使用import 语句简单地列出希望引用的所有类的包限定名称。一个完整的例子:

MainClass.java:

import foobar.OtherClass;

public class MainClass {
    public static void main(String[] args) {
        System.out.println(OtherClass.SomeArray.length);
    }
}

OtherClass.java:

package foobar;

public class OtherClass {
    public static final int[] SomeArray = {3, 42, 0, 9};
}

【讨论】:

    【解决方案3】:
    import java.util.ArrayList;
    public class ImportInJava {
        public static void main(String[] args) {
            ArrayList<String> theArrayList = ArrayListCreator.getArrayList();
            System.out.println(theArrayList);
        }
    }
    

    在另一个班级:

    import java.util.ArrayList;
    
    public class ArrayListCreator {
        public static ArrayList<String> getArrayList() {
            ArrayList<String> list = new ArrayList<String>();
            list.add("Some");
            list.add("Values");
            return list;
        }
    }
    

    【讨论】:

      【解决方案4】:

      尝试使用导入

      //File1.java 
      package some;
      class SomeClass { 
         public static int [] bigarray =  initFromFile();
      
         private static int[] initFromFile() { 
          ...
         }
      }
      //File2.java
      package other;
      
      import some.SomeClass; //<-- use SomeClass
      
      class Other {
         public static void main( String ... args ) { 
            // use it
            int [] data = SomeClass.getData(); //<-- get the array
          }
      }
      

      您应该考虑不使用类级别的属性(具有 static 的属性)和更好的数据结构(如 List )。

      但对于你所问的,这就是答案。

      【讨论】:

        【解决方案5】:

        Java 没有预处理器,也没有相当于 C 或 C++ 的 include 语义。 include 只是在 include 语句的位置插入另一个文件的内容,在 Java 中 import 只是告诉编译器包含导入类的命名空间以解析引用的类。

        要以最类似于 Java 的方式执行您想要的操作,您需要将数据放入 classpath 上的文件中,然后在运行时使用 BufferedReader 读取该文件以读取一行一次数据并构建类型安全的List&lt;String&gt; 很可能是ArrayList&lt;String&gt;。将List 的信息放在与Main.class 相同的目录中名为datafile.txt 的文件中,这样就可以了。

        import java.io.BufferedReader;
        import java.io.IOException;
        import java.io.InputStream;
        import java.io.InputStreamReader;
        import java.util.ArrayList;
        import java.util.List;
        
        public class Main
        {
            public static void main(final String[] args)
            {
                try
                {
                    final InputStream inputStream = Main.class.getResourceAsStream("datafile.txt");
                    final InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
                    final BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                    final List<String> list = new ArrayList<String>();
                    while (bufferedReader.ready())
                    {
                        list.add(bufferedReader.readLine());
                    }
        
                    int index = 0;
                    for (final String s : list)
                    {
                        System.out.format("%d:%s\n", index, s);
                        index++;
                    }
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
        

        【讨论】:

          【解决方案6】:

          有点跑题了,但是……

          如果您想编写惯用的 Java,请尽快学习 Collections API。

          它们通常比数组有用得多。

          例如您可以使用 TreeMap 或 TreeSet 在创建数据集合时自动对其进行排序。

          【讨论】:

            【解决方案7】:

            如果适用于您的情况,Java 与 C 的 include 最接近的是 import 语句。试试 Sun - er Oracle Java Tutorial about packages 了解更多关于使用它的信息。

            也就是说,您可能想尝试使用 Java 的 ArrayList 而不是滚动您自己的数组类。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-11-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-04-15
              • 2011-05-27
              相关资源
              最近更新 更多