1

私は2つのインターフェース構造を持っています。

MyInterface1

public interface MyInterface1{

public Object SUM(Object O,Object P);

}

MyInterface2

public interface MyInterface2{

public int SUM(int O,int P);
public double SUM(int O,double P);
public double SUM(double O,double P);
public double SUM(double O,int P);

}

コードの効率を維持するためにインターフェイスを実装するためのより良い設計アプローチはどれですか?

4

6 に答える 6

6

2 番目のアプローチ (オーバーロード) は、厳密に型指定されたメソッド シグネチャが含まれているため、はるかに優先されます。

次のコードについて考えてみてください。

public class InterfaceImpl implements MyInterface2{

    public Object SUM(Object O,Object P){
        //Really what can I do here without casting?

        /* If I have to cast, I might as well define
         types in the method signature, guaranteeing
         the type of the arguments
        */

       //Lets cast anyway
       return (Integer) O + (Integer) P;
    }

    public static void main(String[] args) throws ParseException {
       System.out.println(SUM(1,2));  //Excellent Returns 3
       //Yikes, valid arguments but implementation does not handle these
       System.out.println(SUM(true,false)); //Class cast exception          
    }
}

結論

メソッドが処理する必要がある型がさらに検出されると、実装は必要なキャストを行う前に型チェックを実行するよう強制されます。メソッド シグネチャは型への引数のみを制限するため、理論的には、Object を拡張するすべてのクラスに対して型チェックを行う必要があります。引数はオブジェクトであるため、チェックするタイプは無限にあり、むしろ不可能です。

オーバーロードされたメソッドを使用することで、メソッドの意図を表現し、許容される型のセットを制限します。これにより、引数が厳密に型指定されるため、メソッドの実装の作成がはるかに簡単になり、管理しやすくなります。

于 2013-04-10T09:34:25.033 に答える
2

他の回答が既に述べたように、オーバーロードの方が優れています。

ただし、4つのバージョンは必要なく、2つだけ必要であることも付け加えておきます。

public interface MyInterface2 {
  public int SUM(int O, int P);
  public double SUM(double O, double P);
}

(int,double) または (double,int) で呼び出すSUMと、int は double にアップキャストされ、2 番目のメソッドが実行されます。

たとえば、次のコードは「さようなら」をコンパイルして出力します。

public class Test implements MyInterface2 {
  public int SUM(int o, int p) {
    System.err.println("hello");
    return o + p;
  }

  public double SUM(double o, double p) {
    System.err.println("goodbye");
    return o + p;
  }

  public static void main(String[] arg) {
    Test t = new Test();
    t.SUM(1.0, 2);
  }
}
于 2013-04-10T09:38:35.063 に答える
1

この場合、2 番目のオプションが適しています。ただし、コードによって異なります。例

interface InterfaceFrequencyCounter
{
    int getCount(List list, String name);
}

interface AnotherInterfaceFrequencyCounter
{
    int getCount(ArrayList arrayList, String name);
    int getCount(LinkedList linkedList, String name);
    int getCount(Vector vector, String name);
}

したがって、上記の場合、2番目のオプションはお勧めできません。最初のものは良いです。

于 2013-04-10T09:43:33.427 に答える
0

上記のように、過負荷の方が優れています。

AmitG で説明されている状況に遭遇した場合は、最も一般的なオブジェクト型だけでなく、インターフェイスを使用する必要があります。とにかく、ほとんどの場合、メソッドはオブジェクトのすべてではなく、一部のサブセットのみで適切に機能します。その場合、AmitG が彼の例で行ったように、共通のインターフェイスを見つけてメソッド シグネチャで使用する必要があります。インターフェイスを使用すると、メソッド クライアントに対する意図が明確に示されます。タイプセーフであり、メソッド内でキャストする必要がなくなります。

于 2013-04-11T07:30:01.817 に答える
0

String誰かに aまたは何かでメソッドを呼び出されたくないので、オーバーロードの方が優れています。

あなたができることは、共通のスーパークラスがある場合はそれを使用することです(Numberあなたの場合、LongとFloatも取得したい場合)。

于 2013-04-10T09:33:20.483 に答える
0

安全なコード メソッドのオーバーロードには、より良いアプローチを使用します。

于 2013-04-10T09:33:45.893 に答える