こんにちは、私はJavaで次のシナリオを持っています: 私はたくさんのクラスを持っています。各クラスにはたくさんのメソッドがあります。現在、このメソッドは整数を返しています(注:すべてのメソッドは、計算された値を整数として返しています)。明日、このメソッドは、文字列またはその他のデータ型 (long など) と同じ計算値を返す可能性があります。今では、すべてのメソッドの戻り値の型を目的の戻り値の型に変更するのは面倒です。[注: このシナリオは、私がフレームワークの開発中であり、私のフレームワークは現在安定していないため、このようなことは変化し続けているためです]. 私はこれが可能かどうか疑問に思っていました、現在整数を指す戻り値の型を作成し、すべてのメソッドでこの戻り値の型を使用するため、明日、このメソッドの戻り値の型を変更する場合は、特定の場所で変更するだけで自動的に戻りますタイプが変わる?これに関する任意のポインタ。ティア。
4 に答える
ジェネリックが必要なように聞こえますが、コード化されたメソッドから返された型を変換する魔法はなく、返されるものの定義のみを変換するという注意事項があります。
public interface Calculator<T> {
public T method1();
public T method2();
public T method3();
}
public class IntegerCalculator implements Calculator<Integer> {
public Integer method1() [
// some implementation that returns an Integer
}
// similar for method2 and method3, which also return Integer
}
public class LongCalculator implements Calculator<Long> {
// similar to IntegerCalculator but all methods return Long
}
クライアントは、使用するコードを次のように定義できます。
Calculator<Integer> = new IntegerCalculator();
しかし、後でに変更します
Calculator<Long> = new LongCalculator();
使用したいすべての型実装のメソッドをコーディングする必要があり、クライアント コードも同様に一般的に動作するように変更する必要がありますが、これが私が行うことです。
次のような一般的な方法を使用できます。
public class NewClass {
public static void main(String []areg){
NewClass nc = new NewClass();
nc.getObject(new Integer(123));
nc.getObject("abc");
nc.getObject(new Long(2));
}
public <T> T getObject(T type)
{
return type;
}
}
呼び出しコードで、返された型を確認して続行できます。
クラスを作成できます。それはあなたの User-Definition-Type です。そのような :
public class ReturnType {
private Object value;
public ReturnType(Object value){
this.value = value;
}
public Integer getIntValue(){
if(value instanceof Integer)
return (Integer)value;
return null;
}
public Long getLongValue(){
// todo
}
public String getStringValue(){
//todo
}
}
メソッドの戻り値の型は、'ReturnType' クラスのインスタンスである必要があります。
お気に入り:
public ReturnType myMethod();
別の機会に、ReturnType クラスのメソッドを追加/削除または変更できます。
メソッドの戻り型だけではありません。ある時点で大きな整数を返したい場合は、そのような値を実際に計算するようにメソッド コードを変更する必要もあります。また、return
メソッドの署名だけでなく、ステートメントも変更する必要があります。メソッドで整数を計算し続けると、BigInteger を返す意味がありません。では、ツールはコードとそれが使用されるすべての場所をどのようにリファクタリングできるのでしょうか?
私が見ることができる最善のことは、Java IDE を使用している場合、メソッドの署名を変更すると、型の不一致がある場合にエラーが出力され、これらのエラーを調べて手動で修正できることです。
あなたのプロジェクトは小さいと思いますが、大きなプロジェクトの場合、そのようなリファクタリングはとにかく扱いにくいでしょう...