2010-10-24 59 views
16

Tôi có một lớp cho các đối tượng ... quả táo nói của lat.Cách thanh lịch để gán id đối tượng trong Java

Mỗi đối tượng mush có một số nhận dạng duy nhất (id) ... làm cách nào để đảm bảo (thanh lịch và hiệu quả) mà mới được tạo có id duy nhất.

Cảm ơn

+0

Lớp 'Apple' của bạn trông như thế nào? – BoltClock

+3

Làm thế nào để sử dụng UUID? http://download.oracle.com/javase/1.5.0/docs/api/java/util/UUID.html – miku

+1

bạn có thể tạo bộ đếm chung và chỉ định id trong hàm tạo. Tôi không chắc chắn nếu điều này là ý tưởng tốt nhất mặc dù. – Orbit

Trả lời

19

static int nextId trong lớp Apple của bạn và tăng nó trong nhà xây dựng của bạn.

Có thể là thận trọng để đảm bảo rằng mã tăng của bạn là nguyên tử, vì vậy bạn có thể làm điều gì đó như thế này (sử dụng AtomicInteger). Điều này sẽ đảm bảo rằng nếu hai đối tượng được tạo chính xác cùng một lúc, chúng không chia sẻ cùng một Id.

public class Apple { 
    static AtomicInteger nextId = new AtomicInteger(); 
    private int id; 

    public Apple() { 
     id = nextId.incrementAndGet(); 
    } 
} 
+1

Thay vì sử dụng đồng bộ hóa, bạn có thể sử dụng loại nguyên tử cho bộ đếm thay vì – Bwmat

+1

Có thể đẹp hơn khi sử dụng [AtomicInteger] (http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ atomic/AtomicInteger.html) cho một cái gì đó như thế này. – Pointy

+1

tính năng này sẽ không hoạt động. Bạn nên đồng bộ hóa tốt hơn trên 'Apple.class' (hoặc sử dụng 'AtomicInteger' như những người khác được đề xuất) – Bozho

12

Sử dụng java.util.UUID.randomUUID()

Nó không phải là int, nhưng nó được đảm bảo là duy nhất:

Một lớp đại diện một nhận dạng duy nhất bất biến (UUID).


Nếu đối tượng của bạn bằng cách nào đó quản lý (ví dụ bằng một số cơ chế bền bỉ), nó thường là trường hợp mà người quản lý tạo ra ID - dùng id kế tiếp từ cơ sở dữ liệu, ví dụ.

Related: Jeff Atwood's article on GUIDs (UUID). Tuy nhiên, nó có liên quan đến cơ sở dữ liệu, nhưng nó không rõ ràng từ câu hỏi của bạn cho dù bạn muốn các đối tượng của bạn được duy trì hay không.

+2

+1 cho giải pháp an toàn cụm. –

5

Bạn đã nghĩ đến việc sử dụng lớp UUID. Bạn có thể gọi hàm randomUUID() để tạo một id mới mọi lúc.

+0

ahhh Bozho đánh tôi với nó. –

2

Có một cách khác để nhận ID duy nhất. Thay vì sử dụng loại dữ liệu int hoặc dữ liệu khác, chỉ cần tạo một lớp:

final class ID 
{ 
    @Override 
    public boolean equals(Object o) 
    { 
    return this==o; 
    } 
} 

public Apple 
{ 
    final private ID id=new ID(); 
} 

Chủ đề an toàn mà không đồng bộ hóa!

+1

Đẹp, nhưng không phải khi cần một id có thể so sánh. – Jarekczek

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