Leniwe tworzenie obiektów

0

W zależności od komendy jaką otrzyma fabryka, wypluje inny obiekt. Przykład:

public class MyFactory() {
    Map<ActionEnum, Object> objects = new HashMap<>();
    
    public MyFactory(... args ...) {
        objects.put(ActionEnum.RUN, new RunObject( ... args ... );
        objects.put(ActionEnum.STOP), new StopObject( ... args ...;
        objects.put(ActionEnum.WALK, new WalkObject(... args ...);
    }
    
    public createObj(ActionEnum action) {
        return objects.get(action);
    }
}

Wada polega na tym, że niepotrebnie initializuje wszystkie możliwe obiekty, jak mogę potrzebować tylko jednego.
Jakbyście to zrobili? Może być tak?

public class MyFactory() {
    Map<ActionEnum, Supplier<ActionObject>> objects = new HashMap<>();
    
    public MyFactory(... args ...) {
        objects.put(ActionEnum.RUN, new Supplier<ActionObject>( () -> new RunObject( ... args ... )));
        objects.put(ActionEnum.STOP), new Supplier<ActionObject>( () -> new StopObject( ... args ...)));
        objects.put(ActionEnum.WALK, new Supplier<ActionObject>( () -> new  WalkObject(... args ...)));
    }
    
    public ActionObject createObj(ActionEnum action) {
        return objects.get(action).get();
    }
}
0

Zainicjalizuj od razu, jeśli możesz. Wpp. będziesz musiał zrobić to leniwie i synchronizować wątki za każdym razem, kiedy będziesz chciał pobrać ten obiekt. Chyba, że jesteś niewielowątkowy.

2

To zależy.
Jaki jest koszt tworzenia tych obiektów?
Może mniejszy niż tworzenie Suppliera (to też obiekt)?
Możesz też użyć tego: https://static.javadoc.io/io.vavr/vavr/0.9.2/io/vavr/Lazy.html
(rozwiązuje to kwestię wielowątkowego dostępu)

0

Ew. guava ma tez cos podobnego do lazy
https://www.baeldung.com/guava-memoizer

1 użytkowników online, w tym zalogowanych: 0, gości: 1