2016-10-06 8 views
1

における一般的な列挙型のキーを渡すために、すなわちBaseクラスを拡張しているChildOne & ChildTwoBaseAgeEnumという名前の列挙が必要です。 1つのメソッドがあります。getAge() が子クラスでよく使用されています。今では、基底クラスでその共通メソッドを移動したいので、私はgetAge()を のオブジェクト(ex-ChildOne.getAge())その子の帰納年齢は列挙型で定義されます。はどのように私は2つのクラスを持つJavaコード

  • 基本クラス

    public class BaseClass { 
        ***// Define getAge() here somehow to get the dynamic value of the*** 
    } 
    
  • 子供1クラス

    public class ChildOne extends BaseClass { 
        public int getAge(){ 
         return AgeEnum.ChildAge.CHILD_ONE.getValue(); 
        } 
    } 
    
  • 子供二級

    public class ChildTwo extends BaseClass { 
        public int getAge(){ 
         return AgeEnum.ChildAge.CHILD_TWO.getValue(); 
        } 
    } 
    
  • 列挙

    public class AgeEnum { 
        public enum ChildAge { 
         CHILD_ONE(12), 
         CHILD_TWO(19); 
    
         private ChildAge(final int text) { 
          this.text = text; 
         } 
    
         private final int text; 
    
         public int getValue() { 
          return text; 
         } 
        } 
    } 
    

は、これまでのところ、私たちはこのような何かを行うことができれば、どのように私は子クラスのgetAge()を呼び出す場合、この場合には、列挙型のコールでこれを構成するために、私は列挙型の値をすべて取得することで分析しています私がしなければならない(私はコンテキストからクラスのインスタンスを取得し、リフレクションを使ってクラス名を取得する可能性がある)子クラスを識別し、実行時にそのクラスならば列挙型定数を渡すことです:

 public class BaseClass { 
     public int getAge(){ 
      return AgeEnum.ChildAge.<dynamicAgeConstent>.getValue(); 
     } 
    } 
+0

BaseClassとChildAge列挙型のインスタンスの間に1対1のマッピングがありますか? –

+1

列挙型を基本クラスの属性にしてみませんか?それをコンストラクタの引数として渡すことができます –

答えて

3

最初に、最も明白な解決策から始めましょう。あなたの仕事は、BaseClassのインスタンスがChildOneでもChildTwoでもないと仮定していないので、実装をクラス階層の上にまったく移動する必要はありません。どうやら、あなたは基本型抽象宣言することで、容易に機能基本型、でメソッドを使用できるようにしたい:

一般
public abstract class BaseClass { 
    public abstract int getAge(); 
} 
public class ChildOne extends BaseClass { 
    @Override public int getAge(){ 
     return AgeEnum.ChildAge.CHILD_ONE.getValue(); 
    } 
} 
public class ChildTwo extends BaseClass { 
    @Override public int getAge(){ 
     return AgeEnum.ChildAge.CHILD_TWO.getValue(); 
    } 
} 

を、それは例えば、可能だとコードの重複を最小限に抑えるために、コードを構造化することをお勧めします

public abstract class BaseClass { 
    public int getAge() { 
     return childAge().getValue(); 
    } 
    abstract AgeEnum.ChildAge childAge(); 
} 
public class ChildOne extends BaseClass { 
    @Override AgeEnum.ChildAge childAge() { 
     return AgeEnum.ChildAge.CHILD_ONE; 
    } 
} 
public class ChildTwo extends BaseClass { 
    @Override AgeEnum.ChildAge childAge() { 
     return AgeEnum.ChildAge.CHILD_TWO; 
    } 
} 

が、ここでは、コードの重複は、それが今の2つのメソッドを持つの隆起複雑価値がないほど小さいです。完全のために

、再び上昇複雑さは、これらの単純な例で報わかどうかは疑問だが、基本クラスの実装により、照会可能

public abstract class BaseClass { 
    @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) 
    @interface Age { AgeEnum.ChildAge value(); } 

    public int getAge() { 
     return getClass().getAnnotation(Age.class).value().getValue(); 
    } 
} 

@Age(AgeEnum.ChildAge.CHILD_ONE) 
public class ChildOne extends BaseClass { 
} 

@Age(AgeEnum.ChildAge.CHILD_TWO) 
public class ChildTwo extends BaseClass { 
} 

、これらの団体にサブクラスの固定staticプロパティを行うことが可能であるが、 。最初の例のように基本クラスがabstractである必要があると思います...

1

あなたが得ることができますその名前で定数を列挙する。例えば、

あなたが本当にenum定数にあなたのサブクラスを「接続」したい場合は、私は単にあなた(以降、それらをハードコーディングするだろう12.

を印刷し

System.out.println(ChildAge.valueOf("CHILD_ONE").getValue()); 

:あなたは、その後のようなものを使用することができます

ChildAge enumConstant = ChildAge.valueOf("CHILD_ONE"); 

唯一可能です)サブクラスをハードコードします。

3

enumを基本クラスの属性にすることも1つの方法です。この属性は、基底クラスのコンストラクタの引数として来るかもしれない:

public class BaseClass { 

    private final AgeEnum.ChildAge age; 

    public BaseClass(AgeEnum.ChildAge age) { 
     this.age = age; 
    } 

    public int getAge() { 
     return this.age.getValue(); 
    } 
} 

その後、サブクラスのみが正しい列挙型を指定する必要があります:

public class ChildOne extends BaseClass { 

    public ChildOne() { 
     super(AgeEnum.ChildAge.CHILD_ONE); 
    } 
} 

そして:

public class ChildTwo extends BaseClass { 

    public ChildTwo() { 
     super(AgeEnum.ChildAge.CHILD_TWO); 
    } 
} 
関連する問題