我应该使用Objects来避免方法重载或方法重载更好吗?

时间:2013-04-10 09:32:29

标签: java design-patterns interface

我有两种界面结构。

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);

}

这是一种更好的设计方法来实现接口,以保持代码效率?

6 个答案:

答案 0 :(得分:6)

第二种方法(重载)更受欢迎,因为它包含强类型的方法签名。

考虑以下代码。

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的每个类都需要进行类型检查,因为方法签名只限制了类型的参数。由于参数是对象,因此需要检查无数种类型,而这是不可能的。

通过使用重载方法,您可以表达方法的意图并限制允许类型的集合。这使得编写方法的实现变得更加容易和易于管理,因为参数将被强类型化。

答案 1 :(得分: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,第二个方法将是将运行的方法。

例如,下面的代码编译并打印“再见”:

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);
  }
}

答案 2 :(得分:1)

在这种情况下,第二种选择是好的。但它因代码而异。实施例

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);
}

所以现在在上面给出的情况下,第二种选择不是好的做法。第一个是好的。

答案 3 :(得分:0)

重载更好,因为您不希望有人用String或其他东西给您打电话。

你可以做的是,如果你有一个普通超级课程(Number,如果你想获得Long和Float也是如此)。

答案 4 :(得分:0)

对于安全代码方法重载更好的方法。

答案 5 :(得分:0)

如上所述,重载更好。

如果遇到AmitG描述的情况,您应该使用接口而不仅仅是最通用的对象类型。无论如何,您的方法几乎总是可以只与对象的一些子集一起正常工作,而不是所有对象。在这种情况下,您需要找到一个通用接口并在方法签名中使用它,就像AmitG在他的示例中所做的那样。界面的使用显示了你对方法cliens的意图,它是类型安全的,并且不需要在方法内部进行强制转换。