2017-04-09 7 views
0

はのは、私はいくつかのマシンを持っているとしましょう:は、列挙型のエントリーを比較する - Javaの

//Test code of course. 
public class Start{ 
    public static void main(String args[]){ 
    System.out.println(Machine.COFFEE_GRINDER.getCatalogId()); 
    System.out.println(Machine.COFFEE_MACHINE.isOfType(Machine.BASIC_MACHINE)); 
    //The above should be true. 
    } 

    private enum Machine { 
    BASIC_MACHINE (-1), 
    BEVERAGE (-1), 
    COFFEE(-1), 
    COFFEE_GRINDER (5), 
    COFFEE_MACHINE (6), 
    GARDEN (-1), 
    LAWN_MOWER (28); 

    private final int catalogId; 

    public int getCatalogId(){ 
     return catalogId; 
    } 

    public boolean isOfType(Machine to){ 
     return this == to; 
    } 

    Machine (int catalogId) { 
     this.catalogId = catalogId; 
    } 
    } 
} 

の例では、彼らがカタログに表示され、それらに関連付けられたID番号を持っていると同じようにマシンがある上に。セクションのセクションとセクションもあります。したがって、BEVERAGEマシンはまだBASIC_MACHINEです。 COFFEEマシンはまだBEVERAGEマシンです。

プログラム内のいくつかの機能は、機能を実行する前に、マシンが実際にBEFERAGEマシンであるかどうかをチェックする必要があります。カタログのCOFFEE_GRINDERとCOFFEE_MACHINEの両方がチェックアウトされ、関数が実行されます。

私が探している動作は、instanceofまたは抽象クラスの継承に匹敵します。とにかくCOFFEE_MACHINEはBASIC_MACHINEのタイプです。私はそれをチェックしたいと思います。

ので:

Machine.COFFEE_MACHINE isa Machine.COFFEE 
Machine.BEVERAGE isa MACHINE.BASIC_MACHINE 
Machine.LAWN_MOWER isa Machine.GARDEN == Machine.BASIC_MACHINE 
Machine.COFFEE_MACHINE isnota Machine.COFFEE_GRINDER 
Machine.LAWN_MOWER isnota Machine.COFFEE 
+1

あなただけの最も専門的な 'enum'値から始まる継承パスを横断し、すべてのステップを確認する必要があります。むしろ簡単ですね。 – Jack

+0

「VENDING」は未定義です。あなたは '飲み物 'を意味しましたか? – Andreas

+0

列挙定数は定数なので、 'Machine.COFFEE_MACHINE = Machine.COFFEE'などを代入することはできません。 "何かを実装しますか?"あなたが達成しようとしている「何か」が何であるかを記述することは役に立ちます。タイトルには継承が記載されていますが、匿名のボディクラスを除いて、enumをサブクラス化することはできません。また、継承と何が関係しているかについては言及していません。それぞれの定数を知るために "型を調べる"必要はありません。それはオブジェクトで、型は 'Machine'です。示されているように、あなたのコードはコンパイルされません。あなたが望むものを明確にし、コンパイル可能なコードを提供してください。 –

答えて

2

可能な解決策は、コールバックを使用して、いくつかの継承と保存されたスーパータイプを模倣することです。 これが最善の方法だと私は不思議です。次のようになり、これを実装

:私はあなたの目標を理解していれば

//Test code of course. 
public class Start{ 
    public static void main(String args[]){ 
    System.out.println(Machine.COFFEE_GRINDER.getCatalogId()); 
    System.out.println(Machine.COFFEE_MACHINE.isOfType(Machine.BASIC_MACHINE)); //Should be true. 
    } 

    private enum Machine { 
    BASIC_MACHINE (-1), 
    BEVERAGE (-1, BASIC_MACHINE), 
    COFFEE(-1, BEVERAGE), 
    COFFEE_GRINDER (5, COFFEE), 
    COFFEE_MACHINE (6, COFFEE), 
    GARDEN (-1, BASIC_MACHINE), 
    LAWN_MOWER (28, GARDEN); 

    private int catalogId; 
    private Machine superMachine; 

    public int getCatalogId(){ 
     return catalogId; 
    } 

    public Machine getSuperMachine(){ 
     return superMachine; 
    } 

    //With callback to superMachine (if present) 
    public boolean isOfType(Machine to){ 
     return this == to || (getSuperMachine() != null && getSuperMachine().isOfType(to)); 
    } 

    Machine (int catalogId) { 
     this.catalogId = catalogId; 
    } 

    Machine (int catalogId, Machine superMachine) { 
     this(catalogId); 
     this.superMachine = superMachine; 
    } 
    } 
} 
0

は正しく、あなたはenum定数の間の関係のネットワークを表現したいです。継承は必ずしもあなたが表現したい関係と一致していないと考えてください。継承モデルはタイプ間でis-aの関係をモデル化します。インスタンス間にconnects-toの関係が必要です。おそらく、「所有者所有」などの「スーパー/継承」とは異なる用語を使用することもあります。それぞれの定数にownerインスタンスへのポインタを埋め込み、静的初期化子とコンストラクタで非循環有向グラフ構造を作成することができます。

public enum NetworkedMachine 
{ 
BASIC_MACHINE(-1, null), 
BEVERAGE(-1, BASIC_MACHINE), 
COFFEE(-1, BASIC_MACHINE), 
COFFEE_GRINDER(5, COFFEE), 
COFFEE_MACHINE(6, COFFEE), 
GARDEN(-1, BASIC_MACHINE), 
LAWN_MOWER(28, GARDEN), 
; 

static final Map<NetworkedMachine, Set<NetworkedMachine>> owners; 
static { 
    Map<NetworkedMachine, Set<NetworkedMachine>> ownership = new HashMap<>(); 
    for (NetworkedMachine machine : values()) { 
    ownership.put(machine, new HashSet<>()); 
    } 
    for (NetworkedMachine machine : values()) { 
    if (machine.owner != null) { 
     ownership.get(machine.owner).add(machine); 
    } 
    } 
    for (NetworkedMachine machine : values()) { 
    Set<NetworkedMachine> owns = ownership.get(machine); 
    ownership.put(machine, Collections.unmodifiableSet(owned)); 
    } 
    owners = Collections.unmodifiableMap(ownership); 
} 

private final int catalogId; 
private final NetworkedMachine owner; 

NetworkedMachine(int catalogId, NetworkedMachine machine) { 
    this.catalogId = catalogId; 
    this.owner = machine; 
} 

public int getCatalogId() { 
    return catalogId; 
} 

public NetworkedMachine getOwner() { 
    return owner; 
} 

public Set<NetworkedMachine> getOwns() { 
    return owners.get(this); 
} 

public boolean isOwned() { 
    return owner != null; 
} 

} 

テスト出力:

BASIC_MACHINE id: -1, owner: [null], owns: [GARDEN, BEVERAGE, COFFEE] 
BEVERAGE id: -1, owner: [BASIC_MACHINE], owns: [] 
COFFEE id: -1, owner: [BASIC_MACHINE], owns: [COFFEE_GRINDER, COFFEE_MACHINE] 
COFFEE_GRINDER id: 5, owner: [COFFEE], owns: [] 
COFFEE_MACHINE id: 6, owner: [COFFEE], owns: [] 
GARDEN id: -1, owner: [BASIC_MACHINE], owns: [LAWN_MOWER] 
LAWN_MOWER id: 28, owner: [GARDEN], owns: [] 
関連する問題