はい。これは、列挙型の各値に対してシングルトンインスタンスを作成した場合と同じです。
パブリック抽象クラスRoundingMode {
public static final RoundingMode HALF_UP = new RoundingMode();
public static final RoundingMode HALF_EVEN = new RoundingMode();
プライベートRoundingMode(){
//プライベートスコープは、このクラス外のサブタイプを防止します
}
}
ただし、enum
構成にはさまざまな利点があります。
- 各インスタンスのtoString()は、コードで指定された名前を出力します。
- (別の投稿で述べたように)列挙型の変数は、
switch-case
制御構造を使用して定数と比較できます。
- 列挙型のすべての値は、
values
列挙型ごとに「生成」されるフィールドを使用して照会できます
- これがアイデンティティの比較に関する重要な1つです。列挙型の値は、クローンを作成せずにシリアル化しても存続します。
連載は大変です。列挙型ではなく上記のコードを使用した場合、IDの等価性は次のようになります。
RoundingMode original = RoundingMode.HALF_UP;
assert(RoundingMode.HALF_UP == original); //合格
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(original);
oos.flush();
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
RoundingMode deserialized =(RoundingMode)ois.readObject();
アサート(RoundingMode.HALF_UP ==逆シリアル化); //失敗する
アサート(RoundingMode.HALF_EVEN ==逆シリアル化); //失敗する
あなたはできますが含ま技術を使用して、列挙せずにこの問題に対処writeReplace
してreadResolve
、(参照http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.htmlを)...
ポイントは私が思うに-Javaは、等価性をテストするためにenum値のIDを使用できるようにするために、その道を離れます。これは推奨される方法です。