Как сделать что-то похожее на включение в C? - PullRequest
2 голосов
/ 23 февраля 2011

Простите за мое невежество, но я новичок в Java, который прибывает из использования структурированного программирования, и я не знаю, как я могу сделать что-то подобное, чтобы включить в c, php или другие подобные языки.

Iесть основной класс, который содержит довольно большой массив.Я хотел бы знать, как отделить массив, поместив его в другой файл или класс и сделать что-то вроде включения в основной класс, чтобы использовать этот массив

Я хочу, чтобы массив инициализировался в файле или внешнем классе, а затем изосновной класс просто назовите курорт.

Как я могу это сделать?Кто-нибудь может выложить пример?

Спасибо!

Ответы [ 7 ]

3 голосов
/ 23 февраля 2011

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

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 голосов
/ 23 февраля 2011

Как вы, вероятно, знаете, в C директива #include <file.h> просто вставляет все содержимое file.h в текущий исходный файл. file.h обычно содержит только объявления функций, которые определены в file.c (или в других файлах с несвязанными именами), а также struct объявлений и #define s. Затем компилятор компилирует текущий исходный файл без знания фактической реализации функций, которые объявлены в заголовочных файлах. После компиляции компоновщик находит фактическую реализацию в других скомпилированных файлах и подключает к ней ваш скомпилированный файл.

В Java сам компилятор может искать определения в других файлах; следовательно, нет необходимости в заголовочных файлах. Вместо этого каждый файл объявляет себя частью пакета , и каждый файл обычно содержит один класс (и все методы (такие же, как функции в 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};
}
1 голос
/ 23 февраля 2011

Java не имеет препроцессора и не имеет эквивалента include семантики C или C ++. include просто вставляет содержимое другого файла вместо оператора include, в Java import просто указывает компилятору включить пространство имен импортируемых классов для разрешения ссылочных классов.

Чтобы сделать то, что вы хотите, наиболее похожим на Java способом, вы хотели бы поместить ваши данные в файл, который находится на classpath, а затем прочитать этот файл во время выполнения, используя BufferedReader, чтобы прочитать одну строку данные за один раз и создать безопасный тип List<String>, скорее всего, ArrayList<String>. Поместите вашу информацию для List в файл с именем datafile.txt в тот же каталог, что и Main.class, и это будет работать.

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();
        }
    }
}
1 голос
/ 23 февраля 2011

Попробуйте использовать импорт

//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).

Но за то, что вы спросили, это ответ.

1 голос
/ 23 февраля 2011
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;
    }
}
0 голосов
/ 23 февраля 2011

Ближайшая Java к C - это оператор импорта, если он применим к вашей ситуации. Попробуйте Sun - er Oracle Java Tutorial о пакетах , чтобы узнать больше об его использовании.

Тем не менее, вы, возможно, захотите попробовать использовать ArrayList в Java вместо использования собственного класса массива.

0 голосов
/ 23 февраля 2011

Немного не по теме, но ...

Если вы хотите написать идиоматическую Java, изучите API коллекций как можно скорее.

Они, как правило, гораздо более полезны, чем массивы.

Например, вы можете использовать TreeMap или TreeSet для автоматической сортировки коллекции данных при ее создании.

...