2011-12-14 4 views
1

Прямо сейчас у меня есть два файла .java.
Main.java:Позвольте конструктору получить доступ к статической переменной

public class Main { 
    static int integer = 15; 
    NeedInteger need = new NeedInteger(); 
} 

и NeedInteger.java

public class NeedInteger { 
    System.out.println(integer); 
} 

Это, конечно, очень упрощенно, но есть ли способ, что я могу это сделать?

+1

Передать переменную в конструктор класса. Вы должны быть более конкретными в отношении ваших реальных потребностей. –

+0

Предположим, у меня около 2000 экземпляров второго класса, которым все нужно получить доступ к трехмерному массиву String, созданному в классе Main. – BarrensZeppelin

+0

Я предполагаю, что вы имеете в виду нечто иное, чем 'String [] [] [] array = Main.threeDimensionalStringArray;' Вы спрашиваете, как ссылаться на статическую переменную из других классов или что-то еще? – Gray

ответ

2

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

Если по каким-либо причинам вы не можете этого сделать, вы можете использовать общедоступный метод статического доступа в главном для доступа к значению (это будет немного лучше, чем просто создание поля).

E.g.

public class Main 
{ 
    private static int integer = 15; 

    public static int getInteger() 
    { 
    return integer; 
    } 
} 

public class NeedInteger 
{ 
    public NeedInteger() 
    { 
    int integer = Main.getInteger(); 
    } 
} 
1

Передать переменную в конструктор класса.

Ссылка на массив будет именно такой - ссылкой.

Или вы можете пройти в самом классе или использовать статический (meh).

1

Добавьте конструктор NeedInteger (и, возможно, элемент, если вам нужно хранить его):

public class NeedInteger { 

    private int integer; 

    public NeedInteger(int integer) { 
     this.integer = integer; 
     System.out.println(integer); 
    } 
} 

Затем передать ваше значение при создании экземпляра:

public class Main { 
    static int integer = 15; 
    NeedInteger need = new NeedInteger(integer); 
} 
+0

Это кажется отличной идеей, но разве это не будет хранить мой огромный массив в каждом отдельном экземпляре класса? – BarrensZeppelin

+0

Поскольку массивы являются ссылками, они копируют только ссылку, а не фактическое содержимое. Так что это не проблема. – Tudor

+0

@ user1098680 Нет, если вы передали ссылку на массив, у него будет ссылка на массив, а не копия массива. –

1

Вы бы иметь (например, использование глобальной переменной) или передать его конструктору.

Примечание: Ваш

public class NeedInteger { 
    System.out.println(integer); 
} 

не имеет какого-либо метода в нем. Я бы рекомендовал все это переписать так:

public Class NeedInteger { 
    NeedInteger(int integer) { 
    System.out.println(integer); 
    } 
} 

Если вы действительно хотите, чтобы работа, которая будет сделано на строительство.

EDIT: Из вашего комментария выше.

Вместо этого, имеют класс структурирована так:

public Class NeedStringArray { 
     NeedStringArray(String[][][] stringArr) { 
      //work with String array here 
     } 
} 

Это не имеет никакого реального дополнительные накладные расходы, поскольку фактический массив не будет принят, а только ссылка на него. Вероятно, вы захотите установить массив final или что-то в этом роде, чтобы избежать его редактирования в конструкторах NeedStringArray.

1

integer является закрытым, поэтому к нему не может обращаться NeedInteger. вам нужно сделать это общедоступным или использовать сеттер или getter, и вам нужно будет использовать Main.integer, поскольку он является статичным.

Как правило, вы устанавливаете конструктор.

+0

, так что если бы я сделал public static integer, мой новый экземпляр мог бы получить к нему доступ с помощью Main.integer? – BarrensZeppelin

+0

есть. static означает, что есть только один экземпляр, так что вы делаете Main.integer. если он не является переменным, вы можете Main i = new Main(); и i.integer. – tehdoommarine

+0

Идеально, это похоже на самое простое решение. – BarrensZeppelin

1

В вашем комментарии Я бы сказал, что вы можете разместить свой массив в singleton или, как предложили другие, второй класс принимает ссылку на массив в конструкторе. Затем вы можете использовать инфраструктуру подстановки зависимостей (например, Guice), чтобы получить их связь

Смежные вопросы