2014-12-09 1 views
0

Я размышлял над этим фрагментом кода в selenium webdriver. Теперь я понимаю, что интерфейсы не могут быть созданы, и что для этого мы должны сделать это через класс, который реализует то же самое.Как объявить переменную типа Интерфейс сказать Список и присвоить значение напрямую?

код, как показано ниже:

List<WebElement> divElements ; 
divElements = driver.findElements(By.tagName("div")); 

Можно назначить значения, как показано выше (почему?) Или он должен не быть:

List<WebElement> divElements=new ArrayList<>(); ; 
divElements = driver.findElements(By.tagName("div")); 

Как это то, что код 1 работает «Если бы кто-нибудь мог уточнить.

+0

Как вы думаете, что происходит с созданным ArrayList (в примере кода 2), когда вы вызываете 'divElements = ...' впоследствии? – Tom

+0

Я думал, что мы инициализируем список массивов, когда я использую divElements = driver.findElements (By.tagName («div»)); – Jagori

+0

Это правильно. И именно по этой причине вам не нужно вызывать 'new ArrayList <>()'. Объект, который будет создан там, будет «потерян» и мусор, собранный после нового назначения. – Tom

ответ

2

Там нет никакой разницы в силе между вашими двумя отрывками.

Подумайте, что любая переменная (отличная от примитивного типа) является ярлыком для объекта, а скорее примечанием к заметке. Вы создаете ярлык, вы прикрепляете его к объекту, и вы можете переместить его на другой объект, если хотите. Вы даже можете установить переменную в null, что означает, что она вообще не привязана к объекту.

Код new ArrayList<>() создает новый объект. Ваш код во втором фрагменте помещает метку (переменную) на этот объект, но сразу же перемещает ярлык на совершенно другой объект. Это делает оригинал ArrayList совершенно неуместным. После одного из ваших фрагментов переменная divElements будет прикрепляться к объекту, который был возвращен методом findElements.

+0

Спасибо всем за ответ. Все ответы были полезны для меня. – Jagori

1

Всего переменные типа List<WebElement>любого типа класса в Java) являются ссылками. Когда вы говорите

divElements = driver.findElements(By.tagName("div")); 

он устанавливает divElements на то, что ссылка возвращается findElements. Возможно, что findElements создал экземпляр нового объекта, который является List (это может быть любой класс, который реализует List); или, возможно, findElements возвращает ссылку на некоторый объект, который был создан ранее; или, может быть, он возвращает null. Это не имеет большого значения. Какой бы объект divElements не ссылался ранее, если таковой имеется, тоже не имеет значения. Ссылка заменяется новой ссылкой.

Дело здесь, если findElements возвращает null, объект, который реализует Listделает или сделал получить экземпляр, где-то. Делая это первая:

List<WebElement> divElements = new ArrayList<>(); 

просто означает, что вы установили divElements в ссылку на новый объект, который только собирается выбросить. Это не имеет положительного эффекта.

2

Возвращаемое значение driver.findElements() - это единственный объект: список WebElements. Это может быть присвоено переменной divElements, и это она.

Вам не нужно выделять пустой ArrayList для результата. То есть пустота будет потеряна и мусора после:

divElemens = driver.findElements(..) 
Смежные вопросы