我有两种界面结构。
public interface MyInterface1{
public Object SUM(Object O,Object P);
}
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);
}
这是一种更好的设计方法来实现接口,以保持代码效率?
答案 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的意图,它是类型安全的,并且不需要在方法内部进行强制转换。