2015-02-12 3 views
-3

Я пытаюсь сделать так, чтобы вы могли изменить размер массива с помощью метода.Изменение размера массива

private String[] options; 

public static void initOptions(int num) 
{ 
    options = [4]; // this doesn't obviously work 
} 

Я мог бы сделать новую переменную

private String[] options; 

public static void initOptions(int num) 
{ 
    String[] options = new String[num]; 
} 

Но тогда я не смог бы разделить массив с остальной частью класса.

+1

Так объединить два варианта: варианты = новый строковый [число]; (Снять параметры String [] = изменить его на просто параметры = ...) –

+0

@Tristan, важно ли вам работать с переменной экземпляра и статическим методом? потому что если нет, то это будет очень легко – Tarik

+0

@Tarik, можно ли использовать ничего статического? – Tristan

ответ

1

Во-первых, вы также имеете несоответствие между статикой поля options и функцией initOptions. Обычно вы хотите, чтобы они были одинаковыми. То есть, вы хотите либо

private String[] options; 

public void initOptions(int num) 
{ 
    options = new String[num]; 
} 

или

private static String[] options; 

public static void initOptions(int num) 
{ 
    options = new String[num]; 
} 

Первый случай имеет один options массив для каждого экземпляра класса, второй имеет один options массив разделяется всеми экземплярами класса ,

Однако это не меняет размер размера. Как только размер массива установлен, он не может измениться. Он создает новый массив желаемого размера и назначает его вашему полю.

Старое значение параметров будет собирать мусор (если ничего не используется), и ни одно из его старых значений не будет в новом экземпляре options. Если вы хотите сохранить все старые параметры, вам нужно будет скопировать их в новый массив. Также ничего, держась исходным поле опций не будет видеть изменения (как они будут держать старый массив, а не вновь созданная версия)

private String[] options; 

public void initOptions(int num) 
{ 
    String newOptions = new String[num]; 
    for(int i=0; i<Math.min(num, options.length); ++i) { 
     newOptions[i] = options[i]; 
    } 
    options = newOptions; 
} 

Есть некоторые вспомогательные утилиты, которые позволят вам сделать некоторые из этого копирования в ядре Arrays пакет, но лучше всего понять, что происходит в первую очередь.

Если вы хотите, чтобы другие владельцы поля параметров отображали изменения, вы можете использовать ArrayList<String> для хранения ваших опций, поскольку это поддерживает изменения длины без необходимости создания вновь созданного объекта.

+0

Я не знаю, нужно ли упоминать сбор мусора. Это приводит к таким вопросам, как «Как я могу убедиться, что эти значения собираются с мусором?» и «Будет ли мусор JVM собирать эти объекты, на которые я все еще ссылаюсь?», потому что искатель считает, что им нужно сделать что-то особенное, чтобы контролировать сбор мусора. – immibis

+0

Сбор мусора не является чем-то особенным, но это неотъемлемая часть языка. Я хотел сказать, что «уничтожен», а не «будет сбор мусора», но на самом деле, если вы используете Java, вам нужно знать, что такое сборка мусора (и нет). –

+0

Я бы сказал: «Вы не сможете получить доступ к старому массиву с помощью« опций »- да, они будут уничтожены в конечном итоге, если их не используют, но это не влияет на правильность вашей программы. Что * * влияет на вашу программу, так это то, что 'options' теперь относится к чему-то другому. – immibis

-1

Если вы хотите, чтобы ваши параметры поля должны быть назначены параметры дорожим ваш метод возвращает вы можете написать

public void initOptions(int num){ 
    String[] options=new String[num]; 
    this.options=options; 
} 

, а затем вызов поля f.e от основной будет вызывать массив.

0

Вы используете переменную экземпляра options и static метод, и это не возможно смешивать их (вы закончите с ошибкой компилятора), если у вас нет никаких реальных ограничений на этот счет, либо выбрать, чтобы сделать options статической переменной или изменить initOptions быть non-static, таким образом, ваш код будет очень простым:

private static String[] options; 

public static void initOptions(int num) { 
     options = new String[num]; 
} 
Смежные вопросы