Используя 'это' в качестве параметра к вызову метода в конструкторе

6
задан 24 September 2008 в 13:46
поделиться

11 ответов

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

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

В Java можно получить удивительное поведение с конструктором, и производные классы - вот пример

http://en.wikipedia.org/wiki/Virtual_functions#Java_3

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

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

Править: мысль это было C#

8
ответ дан 8 December 2019 в 13:51
поделиться

Из любопытства, почему Вы передаете 'это' функции членства того же класса? setTopWorldAgent () может использовать 'это' непосредственно. Это не похоже на Вашего конструктора, или setTopWorldAgent () статичны, таким образом, я не уверен, почему Вы передали бы функцию членства что-то, к чему это уже имеет доступ.

Если я не пропускаю что-то...

5
ответ дан 8 December 2019 в 13:51
поделиться

Почему был бы setTopWorldAgent потребность this как аргумент? На основе вызова это - метод экземпляра, таким образом, это могло сослаться this не будучи должен получить его в качестве параметра.

2
ответ дан 8 December 2019 в 13:51
поделиться

Я думаю главное, с какой стати Вы передаете 'это' в качестве параметра методу в 'этом'?

Следующее протестировало бы то, что Вы говорите, происходит с Вами, и я не испытываю затруднений из-за него.

public class Test {
  public Test() {
    this.hi(this);
  }
  public void hi(Test t) {
    System.out.println(t);
  }

  public static void main(String[] args) throws Exception {
    Test t = new Test();
  }
}
1
ответ дан 8 December 2019 в 13:51
поделиться

Учитывая, что setTopWorldAgent, кажется, метод экземпляра, почему Вы проходите через это к нему так или иначе?

1
ответ дан 8 December 2019 в 13:51
поделиться

"это" никогда не должно быть пустым. Вы уверены, что исключение выдается из-за этого?

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

0
ответ дан 8 December 2019 в 13:51
поделиться

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

0
ответ дан 8 December 2019 в 13:51
поделиться

Если Ваш Agent реализует ITopWorldAgent затем, необходимо на самом деле сделать это:


Agent agent = new Agent("John", 9);
agent.setTopWorldAgent(agent, "Top_World_Agent", true);

В противном случае затем, почему Вы устанавливаете что-то таким образом, что Вы?

Я предполагаю, что что-то в setTopWorldAgent методе использует значение, которое еще не было инициализировано в Вашем конструкторе.

0
ответ дан 8 December 2019 в 13:51
поделиться

this не является пустым, так много уверено. Это было выделено.

Тем не менее нет никакой потребности передать this в метод это автоматически доступно во всех методах экземпляра. Если помехи метода, можно хотеть, осуществляют рефакторинг его в метод экземпляра.

0
ответ дан 8 December 2019 в 13:51
поделиться

Правила Java указывают, что Вы никогда не должны передавать 'это' другому методу от его конструктора по простой причине, что объект не был полностью создан. Объект, на который это ссылается, может быть в непоследовательном состоянии. Я удивлен, что фактическое, 'эта' ссылка является нулевой, но нисколько не удивила того некоторого члена 'этого', пустое, когда она передается setTopWorldAgent, и что метод выдает исключение из-за этого.

Обычно можно сойти с рук передача 'этого' от конструкторов, пока Вы на самом деле не получаете доступ ни к каким участникам или называете методы, например, если Вы хотите установить ссылку на 'это' в другом объекте.

В этом случае, конечно, аргумент является ненужным, поскольку метод уже имеет ссылку на 'это'.

0
ответ дан 8 December 2019 в 13:51
поделиться

Довольный Вы добрались до ответа. Я хотел бы добавить, что передача 'этого' в качестве параметра может привести к неожиданным проблемам параллелизма. Вы в основном обеспечиваете возможность состояния объекта, которым будет небезопасно управлять потенциально неориентированный на многопотоковое исполнение код.

0
ответ дан 8 December 2019 в 13:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: