2011-02-22 7 views
0

「測定」というオブジェクトを作成しようとしています。この測定オブジェクトには、calculate()メソッドが1つしかありません。 (インタフェースまたはクラスである可能性がありますが、どちらが最適かはわかりません)。ジェネリッククラスのメソッドとして別のクラスのメソッドを有効にする方法

私は多くの異なる測定値を持ちますが、それらを実装しようとする方法は、静的メソッドとしてこれらの測定値をすべて含むクラスを持つことです。

私は本質的にクラスからMeasurementオブジェクトにstaticメソッドをロードしようとしています。ここでmeasurement.calculate()を呼び出すことができます。

私が考えている唯一の方法は、ReflectionでMethodクラスを使用し、各MeasurementがMethod(別のクラスの静的測定メソッド)でインスタンス化されていることです。 。 Measurementクラスのcalculate()メソッドは、それぞれのオブジェクトがインスタンス化されたメソッドを呼び出します。

これを実装するにはどうすればよいですか?

ありがとうございました!

+0

私はちょうど答えて、あなたの動機に疑問を呈していないと知っていますが...親愛なる神様、なぜですか? – johusman

+0

私は500回以上測定しています。それらのほとんどは単一のステートメントではなくなります。私はそれらを簡単に含むファイルを変更/読み込めるようにしたい。私はメソッドコールとしてそれらを保つことを望むだろうが、それは不可能なので、私はそれらの間の唯一の差別であるので、すべてのメソッドを作ると思った。結局のところ、私は一つ一つの測定値を作ることを避けたいと思います。私はさまざまな方法に門戸を開いていますが、クラスを作ることを避けることはあまりにも不合理だと思いません。私のニーズに不必要に苦労しているようです。 – Bijan

+0

私はこれを行う代わりの方法は、クラス内のすべてのメソッドを含むだけで、そのクラス内の任意のメソッドを測定として利用することだと思います... – Bijan

答えて

3

これは、あなたがタスクをやりたいやり方を決めて、途中でもっと複雑な問題を作成したようです。すべてのオブジェクトが実装するインターフェースを作成することを提案することで、うまく始まりました。しかし、1つの静的なクラスでそれらをすべてグループ化することは、物事が崩壊し始めるところです。

より良い組織は、各測定クラスにその計算メソッドを実装させることです。この方法では、Foosを扱うときに、Foos、Bars、Bizzes、Bazzesに関連するコードを持つ大きなクラスに行く必要はありません。あなたは、少なくとも100のクラスを持つことができると言った、これはあなたの静的なクラスを最初に働くことが困難になります。計算の多くの実装を必要としない可能性があります。継承階層を構築することで、コードをさらに細分化して整理することで、これを達成することができます。

public interface Measurable<T> { 
    T calculate(); 
} 

public class Foo implements Measurable<Integer> { 
    private int a; 
    private int b; 
    @Override 
    Integer calculate() { 
    return a + b; 
    } 
} 

public class Foo implements Measurable<Double> { 
    private double a; 
    private double b; 
    @Override 
    Integer calculate() { 
    return a/b; 
    } 
} 

あなたが実際に探しているものについてのより多くの情報を持っているが、それは良い例を提供し、あなたは物事を柔軟にすることができますどのように表示する必要があり、基本的なテンプレートです。

+0

@philonousにも向けられていますが、私は各測定実装のためのクラスを作成しないでください。私はそれ以上の方法ではないことを好むだろう。私は、この振る舞いは通常、それぞれのクラスの中でそれぞれをラップすることによって実装されることを理解していますが、これはテキストを減らすために避けたいものです。 – Bijan

+0

私が考えることのできるもう一つの方法は、Measurementクラスを忘れて、すべての測定メソッドが定義されているクラス内の任意のメソッドとして測定値を管理することです。 – Bijan

0

問題を述べたように、「測定オブジェクト」をインターフェイスとして実装する必要があります。これには1つのメソッドしかなく、このメソッドはすべての単一の特定の「測定オブジェクト」で実装する必要があります。あなたのアプローチは、内省的なコードで補完されたGod classのように見えます。polymorphismを使ってより簡単に達成される振る舞いを模倣するだけです。

だから、もう少し具体的にする:

public interface Measurable { 
    public void calculate(); 
} 

、次のように単一の測定戦略が、その後実施される:

public class MeasurementA implements Measurable { 

    @Override 
    public void calculate() { 
     System.out.println("I am doing a very cool measurement."); 
    } 

} 

これは、次の方法で使用することができる。

public class Controller { 

    public static void main(String[] args) { 

     ArrayList<Measurable> measurables = new ArrayList<Measurable>(); 
     measurables.add(new MeasurementA()); 
     measurables.add(new MeasurementB()); 

     for (Measurable measurement : measurables) { 
      measurement.calculate(); 
     } 
} 
関連する問題