2016-11-30 14 views
6

Lớp học có được liệt kê bên dưới một singleton không? Vì hàm tạo được khai báo là công khai, tôi có thể suy ra rằng lớp đó là một singleton có triển khai sai không?Lớp này có phải là singleton không?

public class CreateDevice extends Functionality{ 

    private static Simulator simulator; 
    ConnectionDB connect = ConnectionDB.getInstance(); 


    public CreateDevice(Simulator simulator){ 
    this.simulator = simulator; 
    } 

    private static CreateDevice instance; 
    synchronized public static CreateDevice getInstance() { 
    if(instance == null){ 
     instance = new CreateDevice(simulator); 
    }  
     return instance; 
    } 
} 
+0

Một lớp không thể là một singleton, chỉ các đối tượng có thể là khi chúng là một loại. Nhưng các lớp có thể thực hiện mẫu đơn để hạn chế instantiation cho một đối tượng :) – zapl

+0

Lưu ý bên: 'simulator' không nên là' static' nếu nó được khởi tạo trong 'CreateDevice' - constructor - hoặc làm cho nó tĩnh và tham chiếu đến nó thông qua classname 'CreateDevice.simulator' HOẶC loại bỏ từ khóa' static'. (Điều này không thực sự có bất cứ điều gì để làm với câu hỏi là singleton, mặc dù) – Hulk

+0

Bạn đang phải. Đây là một mã có vấn đề cần được sửa đổi. –

Trả lời

1

Bạn có thể làm cho nó thành một đĩa đơn, nhưng sau đó bạn cần phải tìm cách khác để đưa trình mô phỏng vào đó.

Trong triển khai hiện tại, trình mô phỏng được đặt lần đầu tiên ai đó gọi hàm tạo. Constructor đó rất lạ vì nó thiết lập một trường tĩnh. Nó cũng sẽ ngay lập tức mở một kết nối, tách biệt với kết nối được sử dụng bởi cá thể singleton.

Nếu phương thức getInstance() được gọi trước khi hàm tạo được gọi ít nhất một lần, trình giả lập không bao giờ được đặt.

Để làm cho nó trở thành một singleton thích hợp, bạn có thể loại bỏ hàm khởi tạo và thêm một hàm tạo riêng không-arg. Bạn cũng sẽ cần một phương thức setSimulator() tĩnh đặt trường tĩnh và đảm bảo nó được gọi trước khi bất kỳ tương tác nào khác với trình mô phỏng được yêu cầu.

Nếu bạn có phụ thuộc giữa các bộ đơn, tôi khuyên bạn nên sử dụng mẫu Inversion-of-Control, nơi một thùng chứa IoC tạo các đối tượng dịch vụ và nối chúng lại với nhau.

+0

Bạn nói đúng, nhưng vấn đề là liệu tôi có nên đổi nó thành singleton thực hay không. –

+0

Nếu bạn thay đổi nó thành một singleton thích hợp, nó sẽ là một sự cải thiện so với tình hình hiện tại. Nhưng việc sử dụng IoC sẽ thậm chí còn cải thiện hơn nữa. – greyfairer

7

Trong từ - không. Vì hàm tạo là public, bất kỳ ai cũng có thể tạo phiên bản mới của nó ở bất kỳ đâu và bất cứ khi nào họ muốn. Làm cho hàm tạo private sẽ giải quyết vấn đề và biến lớp thành một singleton.

+0

Vấn đề là mã có thể sai và tôi suy ra từ mã khác mà lớp này có thể là singleton (Bạn có thể tưởng tượng rằng chức năng của nó chỉ là tạo một thiết bị để không cần nhiều phiên bản) Vì vậy, tôi tự hỏi tôi cần phải thay đổi nó thành singleton thực. –

2

Tôi muốn nói rằng bạn đúng khi nói rằng đây không phải là Singleton trong quá trình triển khai hiện tại. Hoặc bạn cần phải làm cho hàm tạo riêng (đó là những gì thường được thực hiện), hoặc nếu vì lý do kế thừa bạn cần một hàm tạo công khai, bạn nên tạo một hàm tạo để kiểm tra xem cá thể đó có rỗng hay không và ném một ngoại lệ nếu nó đã tồn tại hoặc tạo nó bằng cách gọi một hàm tạo riêng khác, gán nó cho cá thể và trả về nó. Lựa chọn đầu tiên là thích hợp hơn, althouth khác hoạt động tốt cho hầu hết các dự án mà một refactor là quá đắt.

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