2013-02-24 24 views

Trả lời

16

Đề xuất của tôi thường là triển khai các đơn như bạn thường trực tiếp. Bỏ qua Android và chỉ cần thực hiện loại điều bình thường như sau:

class Singleton { 
    static Singleton sInstance; 

    static Singleton getInstance() { 
     // NOTE, not thread safe! Use a lock if 
     // this will be called from outside the main thread. 
     if (sInstance == null) { 
      sInstance = new Singleton(); 
     } 
     return sInstance; 
    } 
} 

Bây giờ gọi Singleton.getInstance() tại thời điểm bạn cần. Singleton của bạn sẽ được khởi tạo tại thời điểm đó và tiếp tục được sử dụng lại miễn là quá trình của bạn tồn tại. Đây là một cách tiếp cận tốt bởi vì nó cho phép người dùng của bạn được phân bổ một cách lười biếng (chỉ khi họ cần), thay vì thực hiện một loạt các công việc phía trước cho những thứ bạn có thể không cần ngay lập tức. người dùng) phải chịu đựng. Nó cũng giúp giữ cho mã của bạn sạch hơn, mọi thứ về singleton của bạn và quản lý của nó nằm ở vị trí riêng của nó, và không phụ thuộc vào một số nơi toàn cầu trong ứng dụng của bạn đang chạy để khởi tạo nó.

Ngoài ra nếu bạn cần một bối cảnh trong singleton của bạn:

class Singleton { 
    private final Context mContext; 

    static Singleton sInstance; 

    static Singleton getInstance(Context context) { 
     // NOTE, not thread safe! Use a lock if 
     // this will be called from outside the main thread. 
     if (sInstance == null) { 
      sInstance = new Singleton(context); 
     } 
     return sInstance; 
    } 

    private Singleton(Context context) { 
     // Be sure to use the application context, since this 
     // object will remain around for the lifetime of the 
     // application process. 
     mContext = context.getApplicationContext(); 
    } 
} 
+1

Tôi khuyên bạn không nên sử dụng singleton. Tôi không hiểu tại sao bạn lại thực sự hối hận vì đã giới thiệu ứng dụng "'. Bạn có thể viết mã xấu cả hai cách và với singleton là nó dễ dàng hơn nhiều. Mã sử ​​dụng đơn không dễ dàng kiểm tra được. Ngoài ra singleton có thể được truy cập từ bất cứ nơi nào, mà đôi khi dẫn đến sử dụng như 'Singleton.getInstance (null)', bởi vì nhà phát triển là "chắc chắn" nó đã được khởi tạo bởi 'Hoạt động' đầu tiên. Mặt khác, lớp con 'Application' tạo cấu trúc, không thể dễ dàng bị phá vỡ. Bạn truy cập mô hình thông qua nó và khởi động nó một cách uể oải nếu nó không có ở đó. –

+0

@hackbod thực hiện hóa đơn pugh * Khởi tạo theo yêu cầu Idiom * singleton trợ giúp hoặc là nó không liên quan đến android? được mô tả trong wikipedia 'public class Singleton { \t // constructor Private ngăn instantiation từ các lớp khác \t tin Singleton() {} \t/** \t * SingletonHolder được nạp vào việc thực hiện đầu tiên của Singleton.getInstance() \t * hoặc quyền truy cập đầu tiên vào SingletonHolder.INSTANCE, không phải trước đây. \t */ \t lớp tĩnh riêng tư SingletonHolder { \t \t riêng cuối cùng tĩnh Singleton INSTANCE = new Singleton(); \t} \t tĩnh công cộng Singleton getInstance() { \t \t return SingletonHolder.INSTANCE; \t} } ' – likejiujitsu

1

Nếu bạn cần đơn khởi tạo (tôi giả định đơn ứng dụng cấp), thì cách thích hợp có thể là mở rộng Application và cung cấp khởi tạo cần thiết theo phương pháp onCreate() của nó. Tuy nhiên, nếu khởi tạo là nặng, có thể là một ý tưởng hay khi đặt nó trong một chuỗi riêng biệt, bắt đầu từ lớp Ứng dụng.

+5

Tôi thực sự ngăn cản mạnh mẽ việc sử dụng các ứng dụng cho việc này. Xem câu trả lời của tôi cho câu hỏi về cách tôi khuyên bạn nên làm điều đó. Tôi thực sự rất tiếc khi giới thiệu ứng dụng, đây chính là bẫy mật ong giúp bạn có được một đoạn mã khởi tạo lớn ở một nơi thực sự không cần thiết và có hậu quả tiêu cực làm chậm quá trình khởi chạy ứng dụng và giới thiệu các phụ thuộc không cần thiết giữa các phần riêng biệt của ứng dụng. – hackbod

+0

Với việc triển khai singleton thông thường, các lớp này sẽ được 'tách ra' khỏi ứng dụng? Bạn có nghĩ rằng, có tham chiếu duy nhất cho một số đối tượng trong ứng dụng và cung cấp phương pháp truy cập (với khởi tạo lười biếng trong đó) là một ý tưởng tồi? – sandrstar

+0

Tôi không chắc chắn những gì bạn có nghĩa là bằng cách tách ra ... Tôi cập nhật câu trả lời của tôi để hiển thị như thế nào bạn nên viết nó nếu bạn cần một bối cảnh. Hoặc việc thực hiện sẽ dẫn đến cùng một vòng đời của singleton sau khi nó được tạo ra (miễn là tiến trình là xung quanh). – hackbod

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