Как реализовать отложенную загрузку с использованием объекта Ghost в Java? - PullRequest
1 голос
/ 05 октября 2019

Я читал главу книги Мартина Фаулера о отложенной загрузке.

Автор приводит пример отложенной загрузки через объект Ghost на C #, который я не знаю. Я пытался понять общее значение, но мне это не удалось, потому что в нем задействовано много классов, а в книге недостаточно объяснений, чтобы понять. Также я попытался найти пример с помощью Google, но все найденные мной места связали меня с примером PHP, который я тоже не знаю.

Не могли бы вы привести пример на Java?

1 Ответ

1 голос
/ 05 октября 2019

Если я правильно понимаю, что вы спрашиваете (я смотрю на 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
    }
}
...