件名のように Java でオブジェクト フィールドを一意としてマークできますか? クラス内で一意の ID を取得したい。
4 に答える
オブジェクトの作成ごとにインクリメントし、ID 変数に割り当てる静的変数を使用して一意の ID を作成できます。
private static int globalID = 0;
private int ID;
public obj()
{
globalID++;
this.ID = globalID;
}
いいえ、それはできません。Controller クラスでそれを管理する必要があります。
あなたの質問は少し漠然としていましたが、限られた情報に基づいて回答しようと思います。
クラス内で一意の ID を取得したい。
Hibernate などのよく知られているフレームワークを介して永続化のためにクラスに一意の ID を指定する場合は、HBM マッピングまたは@Id アノテーションを使用して指定できます。
特定のクラスのインスタンスが (ランタイムの観点から) 一意であることを確認する場合は、.equals メソッドをオーバーライドし、「一意の ID」として使用しているフィールドに基づいて .equals で比較を行う必要があります。クラスの」。特定のフィールドが「一意の ID」であることを示す何らかの開発時のインジケーターが必要な場合は、いつでもカスタム アノテーションを作成できます。
これは、Apache Commons Lang ライブラリを使用して .equals および .hashCode をオーバーライドする方法に関する別の StackOverflow 投稿からのエクセルレットの回答です。これを使用して、.equals オーバーライドを変更するだけで、「一意の ID」として使用しているフィールドを比較できます。
一意である必要があるという事実を除いて、一意のフィールドの内容を気にしない場合は、nukebauer によるソリューションを使用できます。
ただし、値を手動で設定し、値がクラスの別のインスタンスによって既に使用されているときに例外をスローする場合は、割り当てられた値を静的セットで追跡できます。
class MyObject {
private Integer id;
private static Set<Integer> assignedIds = new HashSet<Integer>();
public void setId(int id) throws NotUniqueException {
if (!this.id.equals(id) {
if (assignedIds.contains(id) {
throw new NotUniqueException();
}
assignedIds.add(id);
this.id = id;
}
}
}
ところで:どちらのオプションもスレッドセーフではないことに注意してください! つまり、2 つのスレッドがまったく同時にインスタンスを作成し、ID を設定すると、同じ ID を取得する可能性があります。これをマルチスレッド環境で使用する場合は、静的変数で同期する同期ブロックでコードをラップする必要があります。