2010-05-14 34 views
17

Edit: Giải đáp - Lỗi là phương pháp không tĩnhJava Singleton Pattern

Tôi đang sử dụng Singleton Design Pattern

public class Singleton { 
    private static final Singleton INSTANCE = new Singleton(); 

    // Private constructor prevents instantiation from other classes 
    private Singleton() {} 

    public static Singleton getInstance() { 
     return INSTANCE; 
    } 
} 

Câu hỏi của tôi là làm thế nào để tôi tạo một đối tượng của lớp Singleton trong khác lớp học?

Tôi đã thử:

Singleton singleton = new Singleton(); 
// error - constructor is private 
Singleton singleton = Singleton.getInstance(); 
// error - non-static method cannot be referenced from a static context 

mã chính xác là gì?

Cảm ơn, Spencer

+0

FYI, một số người tránh việc sử dụng của 'get' đây trong' getInstance() 'vì [quy ước đặt tên JavaBean] (http://en.wikipedia.org/wiki/JavaBeans#JavaBean_conventions) cho các thuộc tính. Một thay thế sẽ là 'instance()'. –

Trả lời

26
Singleton singleton = Singleton.getInstance(); 

là cách chính xác. Đảm bảo phương pháp getInstance() của bạn thực sự là static.

Kể từ khi thực hiện Singleton của bạn là xa là an toàn - đối tượng của bạn có thể được khởi tạo thông qua phản ánh, bạn có thể muốn tạo một singleton dựa trên enum

+0

Đó là chính xác những gì tôi đã làm, quên để làm cho phương pháp tĩnh. Cảm ơn – Spencer

+0

Tôi không nghĩ rằng một trong những nhu cầu để bảo vệ mã không bị lạm dụng với sự phản ánh. Những người sử dụng sự phản chiếu (nên) biết những nguy hiểm. –

+2

@Bart van Heukelom về mặt lý thuyết tôi đồng ý với bạn hoàn toàn. Nhưng than ôi trong thực tế điều này thường không đúng :) – Bozho

2

này một:

Singleton singleton = Singleton.getInstance(); 

nên làm việc. Đây là cách bạn gọi các phương thức tĩnh trong Java. Và phương thức getInstance() được khai báo là static. Bạn có chắc chắn đang sử dụng cùng một lớp học Singleton không? Hoặc có thể bạn đã nhập một lớp được gọi là giống nhau trong một số gói khác.

3

Singleton singleton = Singleton.getInstance(); sẽ hoạt động - lỗi đó không có ý nghĩa, với mã của bạn; bạn có chắc là bạn đang báo cáo chính xác không? (Nó sẽ có ý nghĩa nếu bạn đã quên để làm cho phương pháp tĩnh getInstance, mà bạn đã thực hiện trong mã của bạn ở trên.)

Mã bạn đã cho chúng tôi cho lớp là chính xác.

Cuối cùng, một lưu ý khái niệm: Thứ nhất, bạn không phải là "tạo ra một đối tượng của lớp Singleton" - đó là toàn bộ điểm của Singleton. :) Bạn chỉ nhận được một tham chiếu đến đối tượng hiện có.

1

Không có gì sai trong việc sử dụng

Singleton singleton = Singleton.getInstance(); 
// error - non-static method cannot be referenced from a static context 

Đây là cách để có được những đối tượng singleton hình thành lớp. Tôi phải có thứ khác. Vui lòng đăng một số chi tiết khác

2
  1. vì hàm tạo là riêng tư, không có ý nghĩa khi tạo đối tượng bằng cách sử dụng hàm tạo.
  2. bạn nên sử dụng public static Singleton getInstance(), nhưng việc triển khai không chính xác.

    if (instance == null) {
    instance = new Singleton();
    }
    return instance;

Đây là cách bạn nên làm điều đó. Điều này đảm bảo rằng nó tạo ra cá thể nếu nó không tồn tại hoặc đơn giản trả về cá thể hiện có. Mã của bạn cũng sẽ làm điều tương tự, nhưng điều này thêm vào khả năng đọc.

2

Vì chúng tôi không muốn cho phép nhiều hơn một bản sao được truy cập. Vì vậy, chúng ta cần phải tự khởi tạo một đối tượng, nhưng chúng ta cần phải giữ một tham chiếu đến singleton để các cuộc gọi tiếp theo đến phương thức accessor có thể trả về singleton (thay vì tạo một cái mới). Thats lý do tại sao là

Singleton singleton = Singleton.getInstance(); 

Cách chính xác để truy cập bất kỳ singletonObject nào.

0

vì phương thức getInstance() là "tĩnh" và trường mẫu quá, yo có thể sử dụng Singleton.getInstance(); Mà không tạo ra exeple mới của lớp. Thihs là poit của singletone

1

Nó vẫn còn có thể tạo ra nhiều hơn một thể hiện của lớp, như sau:

Singleton.getInstance().clone()