пятница, 2 ноября 2007 г.

Java Puzzle 53: Do Your Thing

Допустим, что есть некоторый библиотечный класс, который нельзя изменить:
public class Thing {
    public Thing(int i) {}
}
Допустим, вам надо отнаследоваться от этого класса следующим образом, чтобы иметь доступным значение, которое передается суперклассу при инициализации:
public class MyThing {
    private final int i;
    public Thing() {
        super(this.i = Generator.getId());
    }
}
Приведенный выше класс не скомпилируется, так как нельзя ссылаться на переменную класса до вызова метода super(). Как можно выкрутиться из этой ситуации, чтобы метод Generator.getId() не вызывался дважды?

Решение использует альтернативный вызов конструктора, описанный в JLS 8.8.7.1:
public class MyThing {
    private final int i;
    public Thing() {
        this(Generator.getId());
    }
    private Thing(int i) {
        super(i);
        this.i = i;
    }
}

Комментариев нет:

Отправить комментарий