2016-09-21 8 views
-3
abstract public class Item 
{ 
    public byte getIndex() 
    { 
     return INDEX; 
    } 
} 

public class Depot extends Item 
{ 
    public static final byte INDEX = 18; 
} 

public class Train extends Item 
{ 
    public static final byte INDEX = 12; 
} 

public class Road extends Item 
{ 
    public static final byte INDEX = 6; 
} 

参照してください。 DepotINDEXですが、Item.getIndex()はこれに達しません。 "super"、またはstatic::という逆のようなものです。Java、将来的には定数にアクセスする? (「超」の反対側)

EDIT:[OK]をので、私はこのすべての屈折することができます

abstract public class Item 
{ 
    public abstract byte getIndex(); 
} 

public class Depot extends Item 
{ 
    public static final byte INDEX = 18; 

    public byte getIndex() 
    { 
     return INDEX; 
    } 
} 

public class Train extends Item 
{ 
    public static final byte INDEX = 12; 

    public byte getIndex() 
    { 
     return INDEX; 
    } 
} 

public class Road extends Item 
{ 
    public static final byte INDEX = 6; 

    public byte getIndex() 
    { 
     return INDEX; 
    } 
} 

問題は:私は繰り返しgetIndex()関数のトンを持っています。

+0

ここにコードがありません... –

+0

あなたはそれにアクセスすると思われましたか? – uoyilmaz

+0

いいえ、本当に。数多くのアイテムが「アイテム」に由来し、すべてがINDEX定数を持ちます。 –

答えて

1

私はちょうど適切なJavaの方法で物事をやり直すのを減らすことを望んでいるのか見たいと思っていました。

abstract public class Item 
{ 
    abstract public byte getIndex(); 
} 

public class Depot extends Item 
{ 
    public byte getIndex() { return 18; } 
// public static final byte INDEX = 18; 
} 

は、そうでなければ、あなたが厄介なデザインパターン取得します[編集]:

abstract public class Item 
{ 
    static protected Map<Class<?>, Byte> indexes=new HashMap<Class<?>,Byte>(); 
    public byte getIndex() { 
     return Item.indexes.get(this.getClass()); 
    } 
} 

public class Depot extends Item 
{ 
    public static final byte INDEX = 18; 
    static { 
     Item.indexes.put(Depot.class, Depot.INDEX); 
    } 
} 

(ジャストエラー/例外処理を追加)

[追加] それとも、イントロスペクションを使用することができますが実行時にパフォーマンスペナルティを支払う(+実際に宣言された場合、コンパイラにチェックを拒否しているという事実INDEX

abstract public class Item 
{ 
    public byte getIndex() { 
     // this will throw *at runtime* if the derived doesn't declare INDEX 
     // And, as is, it's insensitive to whether or not the 
     // INDEX is static or instance field (so you need to refine your 
     // verifications - see the java.lang.reflect.Field) 
     return this.getClass().getField("INDEX").getByte(); 
    } 
} 

あなたはより良い選択肢が好きですか?

+0

私の編集した質問を参照してください、その理由はありません –

+1

@JohnSmith "問題:私は繰り返したくさんのgetIndex()関数を持っています。 - はい、そうです。私はあなたに「静かな祈り」(https://en.wikipedia.org/wiki/Serenity_Prayer)、特に「私が変更できないことを受け入れる」という部分をお勧めします。 –

+1

はい。これはあなたが得ることができる、それを取るか、またはそれを残すことができる最高です。 –