2012-05-08 10 views
1

単純なオブジェクトPersonを持つとしましょう。それを識別するint IDを持つPersonです。 Personの新しいインスタンスごとに、そのPersonクラスのコンストラクタに新しいID値(+1)を与えるにはどうすればよいですか? (私はこれにDBを使用しません)オブジェクトを作成するときに、コンストラクタ内で変数を自動的に割り当てる方法

+1

答えは他のすべての答えながら、スレッドセーフである(されています私の答えを含む正確な重複は私が最初だったが)そうではない。 –

答えて

9

は静的AtomicIntegerを使用します。

final class Foo { 
    private static final AtomicInteger seed = new AtomicInteger(); 
    private final int id; 

    public Foo() { 
    this.id = seed.incrementAndGet(); 
    } 
} 

は、詳細についてはこちらをご覧ください:https://stackoverflow.com/a/4818753/17713

1

は静的変数を使用します。静的変数はクラスに直接バインドされず、クラスインスタンスにバインドされません。

例(C#で):

public class Person{ 
    public static int Increment = 1; 

    public int ID; 
    public Person(){ 
     this.ID = Increment; 
     Increment++; 
    } 
} 

このように、すべてのクラスのインスタンスは、固有のID-S(1増加)を有するであろう。

EDIT:このアプローチはスレッドセーフではありません。@ Muduの答えをご覧ください。

+1

それはスレッドセーフではなく、パブリック変数を持つことをお勧めしません。また、Java命名規則に従うこともありません。 –

+1

これはスレッドセーフではありませんが、複数のスレッドを使用していない限りは問題ありません。 –

+1

この解決策は、 'Person'コンストラクタのスレッド型呼び出しを考慮しません。 –

1

あなたはすべてのインスタンスaccros共有されている

public class YourClass { 
    private static int generalIdCount = 0; 
    private int id; 

    public YourClass() { 
     this.id = generalIdCount; 
     generalIdCount++; 
    } 
} 
1

使用静的集計フィールドのようなものを使用する必要がありますPerson

木瀆-S @
1

あなたは現在のカウンタ値の静的変数を作成し、作成した際にIDにそれを割り当てることができます...

public class Person { 

    // same across all instances of this class 
    static int currentCounter = 0; 

    // only for this instance 
    int personId; 

    public Person(){ 
     personId = currentCounter; 
     currentCounter++; 
    } 
} 
+1

Lukaの提案と同様に、これはスレッドセーフではありません。 –

+1

真。 @Muduのようなスレッドセーフな答えは関係なくすべてのコンテキストを許可しますが、自分のコンテキストに最も適した答えを選択することは、作者に任せています。ご意見をいただきありがとうございます。 – wattostudios

関連する問題