Может ли обратный вызов к не полностью созданному объекту Java быть четко определен?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Может ли обратный вызов к не полностью созданному объекту Java быть четко определен?

Сообщение Anonymous »

Если конструктор класса T передает this в качестве аргумента некоторому методу foo, и foo немедленно выполняет обратный вызов T объекта (который еще не завершил выполнение своего конструктора), очевидно, что все может пойти не так, но что, если я проверю, что все поля, к которым обращается foo, инициализированы?
Чтобы сделать понятно, о чем я говорю, вот пример, который идет не так:

Код: Выделить всё

public class T {
// Class that accesses T, which could be defined somewhere outside
// rather than nested here.
static class FortyTwoChecker {
void foo(T t) {
System.out.println("Fourty-two is: "+t.get42());
}
}

// Fields set in constructor.
private final int fortyTwo;

// Callback method that accesses (and might also modify, in some other case)
// fields set in constructor.
int get42() { return fortyTwo; }

T(FortyTwoChecker checker) {
checker.foo(this);  // goes wrong!
fortyTwo = 42;
}
}
При создании объекта T выводится Fourty Two: 0, поскольку foo вызывается до того, как fortyTwo набор. Но если я поменяю местами два оператора в конструкторе T, результат будет: Fourty Two: 42, как и ожидалось. Мой вопрос: могу ли я быть уверен, что такой код всегда работает так, как ожидалось? То есть гарантировано ли, что компилятор/ВМ не нарушит порядок последовательного выполнения и что что-то не даст сбой просто потому, что происходит вызов метода неполностью сконструированного объекта?
Я ожидаю, что на этот вопрос может быть сложно ответить, если обратный вызов выполняется из другого потока, но могу ли я хотя бы быть в этом уверен, если все происходит в том же потоке?
( Очевидно, было бы неплохо убедиться, что обратный вызов не будет выполняться до тех пор, пока объект T не будет полностью создан — и не придется беспокоиться — но в случае использования, который заставил меня задуматься об этом, возникают другие проблемы. )

Подробнее здесь: https://stackoverflow.com/questions/786 ... ll-defined
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»