2011-10-05 49 views
7

Tôi cần một lớp tạo đối tượng gán một ID cho mỗi đối tượng được tạo. ID này giống như một thuộc tính int cho lớp. Tôi muốn giá trị này (ID) được tăng lên mỗi khi một đối tượng được tạo ra và sau đó được gán cho đối tượng đó bắt đầu bằng 1. Nó tấn công tôi rằng tôi cần một thuộc tính int tĩnh.Trình tạo ID cho các đối tượng được tạo ra

Tôi có thể khởi tạo thuộc tính tĩnh này như thế nào?

Tôi có nên tạo phương thức riêng để thực hiện tăng ID (như trình tạo ID) được gọi bên trong hàm tạo không?

Cách nói chung hiệu quả nhất và được thiết kế tốt để thực hiện điều đó là gì?

+1

Chỉ cần nhận xét: Nếu bạn đang ở trong môi trường nhóm máy chủ thì phương pháp này sẽ không thành công. – home

Trả lời

6

Cũng giống như bạn đề cập đến sử dụng static int cho id và tăng nó khi tạo đối tượng mới.

class MyObject { 

    private static int counter = 0; 

    public final int objectId; 

    MyObject() { 
     this.objectId = counter++; 
    } 
} 

Xin lưu ý rằng bạn cần phải bảo vệ counter++ nếu MyObject được tạo ra bởi nhiều chủ đề (ví dụ sử dụng AtomicInteger như câu trả lời khác đề nghị).

+1

Tôi nghĩ câu lệnh cuối cùng phải là: this.objectId = ++ counter; . Bằng cách này đối tượng đầu tiên có giá trị 1 cho ID, nếu không 0. – arjacsoh

+0

@arjacsoh Tùy thuộc vào kịch bản của bạn, tuy nhiên tôi muốn id bắt đầu bằng 0. :) – dacwe

5

Bạn cũng có thể thử java.util.concurrent.AtomicInteger, mà tạo ra ID trong

  1. một cách nguyên tử và
  2. tuần tự

Bạn có thể sử dụng điều này trong một bối cảnh tĩnh như:

private static final AtomicInteger sequence = new AtomicInteger(); 
private SequenceGenerator() {} 

public static int next() { 
    return sequence.incrementAndGet(); 
} 
4

Tôi khuyên bạn nên sử dụng AtomicInteger, có chủ đề an toàn

class MyObject 
{ 
    private static AtomicInteger uniqueId=new AtomicInteger(); 
    private int id; 

    MyObject() 
    { 
     id=uniqueId.getAndIncrement(); 
    } 

} 
+0

Tại sao bạn sử dụng getAndIncrement() thay vì incrementAndGet()? Nó chỉ là một sự khác biệt giữa var ++ và ++ var? – EarthMind

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