2010-03-02 27 views
5

Làm cách nào để hạn chế tạo đối tượng không quá 3 trong lớp Java?Làm cách nào để hạn chế tạo đối tượng không quá 3 trong lớp Java?

Bạn có thể cho tôi ý tưởng về cách tôi có thể làm điều đó không?

+2

Bạn đang đề cập đến mẫu thiết kế erm, tripleton? Như trong, chính xác ba trường hợp của một lớp học nhất định? –

+0

Tôi không hiểu chính xác vấn đề của bạn là gì ... – romaintaz

+3

Có vẻ như đây là một bài tập/câu hỏi phổ biến trong một số khóa học. Tôi đã nhìn thấy câu hỏi nhiều, nhiều lần (hầu như luôn luôn với số lượng là 3) và tôi vẫn chưa thấy một lý do chính đáng cho sự hạn chế này. –

Trả lời

7

Tạo lớp học của bạn thông qua một nhà máy (xem mẫu thiết kế) và giới hạn nó đến 3 trường hợp bằng cách sử dụng bộ đếm đơn giản.

+0

bộ đếm tĩnh đơn giản và đồng bộ hóa phương thức nhà máy. –

1

Mẫu nhà máy là con đường để đi. Hoặc có thể sử dụng bộ đếm tĩnh. Cần phải cẩn thận về an toàn luồng.

1

Bạn cũng có thể xem ObjectPool của Apache Commons. Mã nguồn có sẵn miễn phí ...

7

Chúng ta có thể hạn chế việc tạo ra các đối tượng trong một lớp học đặc biệt bằng sự thay đổi nhỏ trong thiết kế Singleton pattern như sau:

public class LimitClass { 

    private static LimitClass limInstance; 
    public static int objCount = 0; 

    private LimitClass(){ 
     objCount++; 
    } 

    public static synchronized LimitClass getLimInstance(){ 
     if(objCount < 3){ 
      limInstance = new LimitClass(); 
     } 
     return limInstance; 
    } 
} 

public class LimitObjectCreationTest { 

    public static void main(String[] args) { 

     LimitClass obj1 = LimitClass.getLimInstance(); 
     LimitClass obj2 = LimitClass.getLimInstance(); 
     LimitClass obj3 = LimitClass.getLimInstance(); 
     LimitClass obj4 = LimitClass.getLimInstance(); 
     LimitClass obj5 = LimitClass.getLimInstance(); 
     LimitClass obj6 = LimitClass.getLimInstance(); 

     System.out.println(obj1); 
     System.out.println(obj2); 

     System.out.println(obj3); 
     System.out.println(obj4); 
     System.out.println(obj5); 
     System.out.println(obj6); 
     } 
} 

Sản lượng mã trên là như sau:

[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 

Sau khi tạo ra ba đối tượng khác nhau, nó lặp lại cùng một đối tượng thứ 3 một lần nữa. Nó không phải là tạo ra các đối tượng khác nhau.

0

lý do tại sao không gán limInstance = null; trong trường hợp khác trong getLimInstance()? trong trường hợp đó nó sẽ không cung cấp bản sao obj3?

public static synchronized InstanceClass getLimInstance() 
{ 
     if(objCount < 3){ 
      limInstance = new InstanceClass(); 
     } 
     else 
     { 
      limInstance=null; 
     } 
     return limInstance; 
    } 


public class LimitObjectCreationTest { 


    public static void main(String[] args) { 
    InstanceClass obj1 = InstanceClass.getLimInstance(); 
    InstanceClass obj2 = InstanceClass.getLimInstance(); 
    InstanceClass obj3 = InstanceClass.getLimInstance(); 
    InstanceClass obj4 = InstanceClass.getLimInstance(); 
    InstanceClass obj5 = InstanceClass.getLimInstance(); 
    InstanceClass obj6 = InstanceClass.getLimInstance(); 

    System.out.println(obj1); 
    System.out.println(obj2); 

    System.out.println(obj3); 
    System.out.println(obj4); 
    System.out.println(obj5); 
    System.out.println(obj6); 

    System.out.println(obj3); 
    } 

}

Kết quả là thế này:

[email protected]

[email protected]

[email protected]

null

rỗng

rỗng

[email protected]

0

Bạn cần phải sửa đổi singleton và tạo ba objects.ans viết ba phương pháp trong mọi đối tượng phương pháp trở lại như là sự trở lại khác nhau ba đối tượng và sử dụng khi bạn cần. nó chính sử dụng không cần phải khai báo biến hoặc đối tượng là tĩnh, bởi vì luôn luôn trả về cùng một đối tượng.

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