2009-04-03 31 views

Trả lời

16

Phân bổ lười biếng đơn giản có nghĩa là không phân bổ nguồn lực cho đến khi thực sự cần thiết. Điều này là phổ biến với các đối tượng singleton, nhưng nghiêm túc nói, bất cứ lúc nào một nguồn lực được phân bổ càng muộn càng tốt, bạn có một ví dụ về phân bổ lười biếng.

Bằng cách trì hoãn phân bổ tài nguyên cho đến khi bạn thực sự cần, bạn có thể giảm thời gian khởi động và thậm chí loại bỏ phân bổ hoàn toàn nếu bạn không bao giờ thực sự sử dụng đối tượng. Ngược lại, bạn có thể phân bổ trước một tài nguyên mà bạn mong muốn cần sau này, điều này có thể làm cho việc thực hiện sau này hiệu quả hơn với chi phí thời gian khởi động, và tránh được khả năng phân bổ không thực hiện sau này.

Đoạn mã dưới đây cung cấp một ví dụ về một singleton uể oải phân bổ:

public class Widget { 
    private Widget singleton; 

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

    private Widget() { 
     // ... 
    } 

    // ... 
} 

Do lưu ý rằng mã này là không threadsafe. Trong hầu hết các trường hợp, truy cập vào phương thức get() phải được đồng bộ hóa theo một số cách.

Khái niệm tương tự (và có lẽ tổng quát hơn) là lazy initialization.

+0

là cụm từ "đối tượng trễ" và "lười biếng init" đồng nghĩa? Như trong tiêu đề của văn bản này * Java Làm thế nào để chương trình: Late Objects Version *? Tôi googled nhưng không thể tìm thấy bất kỳ tài liệu tham khảo ngoài văn bản đó. – hydeph

+1

@hydeph, có vẻ như Deitel có hai phiên bản của cuốn sách đó, một với "các đối tượng trễ", trong đó các chương ban đầu theo kiểu thủ tục (và giới thiệu các lớp/đối tượng sau) và một với "đối tượng ban đầu", nơi các lớp/đối tượng được giới thiệu ngay lập tức. Họ đang sử dụng "đối tượng trễ" và "đối tượng ban đầu" để phân biệt giữa các phong cách giảng dạy này. Nó không có bất kỳ mối quan hệ nào để khởi tạo lười biếng. –

Các vấn đề liên quan