2012-07-18 6 views
0

Я хочу метод метода вызова из класса Path. Мне нужно установить некоторую длину массива и соответствующие значения массива на входе. Это мой класс:Как установить значения массива в качестве параметров?

class Path { 
int number; 
String[] path_name = new String [number]; 
Path (int n, String [] p){ 
    number=n; 
    path_name=p; 
} 
public void path(){ 
for (int i=1; i<number; i++){ 
    driver.findElement(By.linkText(path_name[i])).click(); 
} 
} 

}

Это, как я пытаюсь вызова метода:

Path pa = new Path (6,'array value'); 
    pa.path(); 

Но я не знаю, как правильно начать «значение массива» - мне нужно установить «один», «два», «три», например. Может ли кто-нибудь помочь?

Я не знаю длину массива на начало, так что я не могу определить несколько строк в конструкторе

ответ

2

В вашем классе существует несколько проблем.

Сначала выполняется инициализация переменных, которые записываются непосредственно в переменные класса до выполняется тело конструктора. Таким образом, ваша инициализация массива path_name всегда будет выполнена со значением по умолчанию number, и это 0. Это работает, но ваш массив не сможет хранить какие-либо значения таким образом.

Теперь, в вашем теле, вы пытаетесь заполнить свой массив path_name содержимым массива p. Но вместо этого вы заменяете экземпляр. Это работает отлично, но если кто-то изменит массив вне класса, он изменится и в этом классе. Я думаю, вы хотите перенести значения с помощью System.arraycopy или Arrays.copyOf.

Для вызова конструктора вы должны вызвать что-то вроде этого:

new Path(6, new String[] {"one", "two", ...}); 

Как улучшения я предлагаю вам сбросить переменную number целиком, как никогда, потому что вы можете в любое время обратиться к размеру массива сам используя path_name.length.

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

Path(int n, String p...){ 
    number=n; 
    path_name = p 
} 

Вы установили, что существует неопределенное количество строк, которые должны быть добавлены после номера при вызове конструктора. Все эти строки автоматически упаковываются в массив String, называемый p. Поскольку этот массив существует только внутри этого конструктора, вы можете безопасно скопировать экземпляр вместо переменных. Вызов конструктора будет выглядеть следующим образом:

new Path(6, "one", "two", ...); 
1

Попробуйте что-то вроде:

Path pa = new Path(6, String[] {"one", "two", "three"}); 

Если вы можете изменить код, который вы, вероятно, использование переменной длины, чтобы сделать его проще:

Path (int n, String p...) 

Тогда вы могли бы просто:

Path pa = new Path(6, "one", "two", "three"); 
0

Если я понимаю, что вы просите правильно, я думаю, что это то, что вы хотите -

class Path { 
int number; 
String[] path_name; 
Path (int length){ 
    path_name = new String[length]; 
    for(int i=1;i<=length;i++) 
     path_name[i-1] = Integer.ToString(i); 
} 
} 

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

class Path { 
int number; 
String[] path_name; 
Path (String p){ 
    path_name = p; 
} 


public void some_method(){ 
    String[] a = {"one", "two", "three"}; 
    Path p = new Path(a); 
} 
} 
+0

это не то, что я имею в виду, мне нужно установить значение строк массива - проблема, я не знаю длину массива, так что не знаю, сколько srtings потребуется в конструкторе – khris

0

Вы можете инициализировать массив строк до начала Путь конкретизации, как это:

String[] p = {"one", "two", "three"}; 
Path pa = new Path(6, p); 
+0

Я не мог, потому что данные будут в любом случае четкими – khris

0

n номер, на который вы ссылаетесь, может быть устранен, если вы принимаете инвариант, что все элементы массива являются допустимыми элементами для пути.

Имея это в виду, вы можете просто

class Path { 
    final String[] pathNames; 
    // uses var args 
    Path(String... paths) { 
     pathNames = paths; 
    } 
    void path() { 
     // uses enhanced for loop 
     for(String path : pathNames) { 
      driver.findElement(By.linkText(path)).click(); 
     } 
    } 
} 

Некоторые критики:

  • Вы в настоящее время создается массив размера number при создании объекта. Но число равно 0 в этой точке. Итак, вы создаете пустой массив.
  • Но вышеприведенный пункт не имеет значения, потому что вы немедленно переназначаете ссылку ...
  • Поскольку вы не защищаете массив от копирования, внешний код может изменять элементы массива. Это, вероятно, не очень хорошо. (Это адресуется var args, где внешний код не имеет доступа к этому массиву. Вы не можете запретить кому-то передавать массив вместо var args, но они, по крайней мере, будут знать о том, что вы ожидаете, что var args , поэтому они все еще имеют возможность изменять внутренне, если они хотят, но вряд ли случайно ввести ошибку таким образом.)
Смежные вопросы