2009-04-03 16 views

Odpowiedz

16

Leniwy przydział oznacza po prostu nieprzydzielenie zasobu, dopóki nie będzie faktycznie potrzebny. Jest to powszechne w przypadku obiektów singleton, ale ściśle rzecz biorąc, za każdym razem, gdy zasób jest przydzielany tak późno, jak to możliwe, masz przykład leniwego przydziału.

Opóźniając przydział zasobów do momentu rzeczywistego ich wykorzystania, można zmniejszyć czas uruchamiania, a nawet całkowicie wyeliminować przydział, jeśli nigdy nie korzystasz z obiektu. W przeciwieństwie do tego, możesz wstępnie przydzielić zasób, którego będziesz potrzebować później, co może sprawić, że późniejsza realizacja będzie bardziej wydajna kosztem czasu uruchamiania, a także uniknie możliwości niepowodzenia alokacji w późniejszym czasie w realizacji programu.

Poniższy kod stanowi przykład leniwie-przydzielonego pojedyncza:

public class Widget { 
    private Widget singleton; 

    public static Widget get() { 
     if (singleton == null) { 
      singleton = new Widget(); 
     } 
     return singleton; 
    } 

    private Widget() { 
     // ... 
    } 

    // ... 
} 

Należy pamiętać, że ten kod nie jest threadsafe. W większości przypadków dostęp do metody get() powinien być zsynchronizowany w pewien sposób.

Podobna (i być może bardziej ogólna) koncepcja to lazy initialization.

+0

są terminy "późne obiekty" i "leniwy init" są równoznaczne? Jak w tytule tego tekstu * Java Jak programować: wersja Late Objects *? Przeszukałem go, ale nie znalazłem żadnych odniesień poza tym tekstem. – hydeph

+1

@hydeph, wygląda na to, że Deitel ma dwie wersje tej książki, jedną z "późnymi obiektami", gdzie początkowe rozdziały są w stylu proceduralnym (i wprowadzanie klas/obiektów później) i jeden z "wczesnymi obiektami", gdzie klasy/obiekty są wprowadzane natychmiast. Używają "obiektów późnych" i "obiektów wczesnych", aby odróżnić te style nauczania. Nie ma żadnego związku z leniwą inicjalizacją. –