2011-10-05 17 views
7

Ho bisogno di una classe che crea oggetti che assegnano un ID a ciascun oggetto creato. Questo ID è come al solito un attributo int alla classe. Voglio che questo valore (ID) venga aumentato ogni volta che viene creato un oggetto e quindi da assegnare a quell'oggetto iniziando con 1. Mi sembra che abbia bisogno di un attributo statico int.Generatore di ID per gli oggetti creati

Come posso inizializzare questo attributo statico?

Devo creare un metodo separato per eseguire l'incremento dell'ID (come un generatore di ID) che viene richiamato all'interno del costruttore?

Qual è in generale il modo più efficace e ben progettato per implementarlo?

+1

Solo un commento: se ci si trova in un ambiente cluster sul lato server questo approccio avrà esito negativo. – home

risposta

6

Proprio come si menziona, utilizzare l'static int per l'ID e incrementarlo quando si creano nuovi oggetti.

class MyObject { 

    private static int counter = 0; 

    public final int objectId; 

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

prega di notare che è necessario per proteggere se counter++MyObject è stato creato da più thread (per esempio usando AtomicInteger come le altre risposte suggeriscono).

+1

Penso che l'ultima affermazione deve essere: this.objectId = ++ counter; . In questo modo il primo oggetto assume il valore 1 per ID, altrimenti 0. – arjacsoh

+0

@arjacsoh A seconda del tuo scenario, preferirei comunque che gli ID inizino con 0. :) – dacwe

5

Si potrebbe anche provare java.util.concurrent.AtomicInteger, che genera gli ID in

  1. un modo atomico e
  2. sequenziale

È possibile utilizzare questo in un contesto statico come:

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

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

vorrei suggerire di usare AtomicInteger, che è thread-safe

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

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

} 
+0

Perché dovresti usare getAndIncrement() invece di incrementAndGet()? È solo una differenza tra var ++ e ++ var? – EarthMind

Problemi correlati