Если я правильно понимаю, что вы спрашиваете (я смотрю на https://www.martinfowler.com/eaaCatalog/lazyLoad.html),, то я не знаю, как получить эту функцию напрямую в Java; вам придется использовать один издругие принципы и оберните его в оболочку-объект-призрак.
По сути, вы инициализируете свой объект с минимальным набором значений, а затем вычисляете значения других полей только при необходимости. Что-то вроде приведенного ниже кода даст вам ленивыйспособ получить Complicated
объект от Ghost
. Я видел подобные объекты, используемые при загрузке информации из базы данных, но не знаю, когда она вам понадобится, или при вычислении особенно сложного или тяжелого хеш-кода.
public class Ghost {
private final int count;
private boolean initialized = false;
private Complicated complicated = null;
public Ghost(int count) {
this.count = count;
}
public Complicated getComplicated(String extraValue) {
// could also check (here and below) this.complicated == null
// in that case doExpensiveOperation should not return null, and there shouldn't be other fields to initialize
if (!initialized) {
synchronized(this) { // if you want concurrent access
if (!initialized) {
complicated = doExpensiveOperation(extraValue);
initialized = true;
}
}
}
return complicated;
}
private Complicated doExpensiveLoad(String extraValue) {
// do expensive things with this.count and extraValue
// think database/network calls, or even hashcode calculations for big objects
}
}