Dobre praktyki programistyczne

Leniwe wartościowanie w Java

11.08.2011

Wywołując niektóre metody możesz nie wiedzieć, czy przekazywane argumenty będą rzeczywiście użyte. W większości wypadków nie powinno to stanowić problemu. Czasem jednak tworzenie niepotrzebnych obiektów czy wykonywanie obliczeń może powodować problemy z wydajnością. W Java wszystkie argumenty są obliczane przed wywołaniem metody. Są na to jednak pewne sposoby.

Załóżmy, że HeavyObject nie może być utworzony w tej metodzie (np. konstruktor może nie być dostępny) i może nie być przez nią w ogóle wymagany. Wartościowanie zachłanne wygląda tak.

  1. class LazyEvaluation {
  2. void useHeavyObject(HeavyObject heavy) {
  3. if (isHeavyObjectRequired()) {
  4. heavy.useIt();
  5. }
  6. }
  7. public static void main(String args[]) {
  8. LazyEvaluation lazy = new LazyEvaluation();
  9. //early evaluation
  10. lazy.useHeavyObject(new HeavyObject());
  11. }
  12. }

Pierwsza metoda leniwego wartościowania używa operatora warunkowego. Obiekt będzie utworzony tylko gdy isHeavyObjectRequired zwróci true.

  1. //lazy evaluation
  2. lazy.useHeavyObject(lazy.isHeavyObjectRequired() ? new HeavyObject() : null);

Drugi sposób używa fabryki obiektów HeavyObject. Może to być ta sama lub osobna klasa. Możesz również zamienić metodę fabryki na statyczną.
  1. class HeavyObjectFactory {
  2. HeavyObject getInstance() {
  3. return new HeavyObject();
  4. }
  5. }
  6. class LazyEvaluation {
  7. void useHeavyObjectFactory(HeavyObjectFactory factory) {
  8. if (isHeavyObjectRequired()) {
  9. factory.getInstance().useIt();
  10. }
  11. }
  12. public static void main(String args[]) {
  13. LazyEvaluation lazy = new LazyEvaluation();
  14. //use factory for lazy evaluation
  15. lazy.useHeavyObjectFactory(new HeavyObjectFactory());
  16. }
  17. }

Leave a Response