方法重载的不同形式 - java

我已经看到与此类似的问题。但是,我找不到确切的答案。我想知道根据情况遵循最佳方法。请说明情况1和情况2的优缺点。

情况1 :

  public class Test {

    public void method1(String s) {
        System.out.println("String s");
    }

    public void method1(String s, String a) {
        System.out.println("String s" + "String a");
    }
}

情况2:

我以以下方式编写了代码。这是一个简单的逻辑,我只想演示实现

public class Test {

    public void method1(String s) {
        new Test().methodImpl(s,null);
    }

    public void method1(String s, String a) {
        new Test().methodImpl(s,a);
    }

    public void methodImpl(String x , String y){
        if(y!=null){
            System.out.println("String s" + "String a");
        }else if(y==null){
            System.out.println("String s");
        }
    }
}

参考方案

这些本身并不是不同的重载形式。 Java中只有一种重载形式(您可以说eh C#的可选参数达到了重载的目的),即提供具有不同签名的多个方法。

您的示例过于简单,无法解释,因为它们实际上并没有保存任何代码。情况1重复了代码,这意味着它成为维护的噩梦,而情况2使方法列表变得混乱,实现也变得混乱,因为情况再次变成了带有重复代码的if语句,因为您已将整个方法主体转储为if-变成4将代码行转换为7行,并没有解决案例1所提出的问题;如果您发现错误,则仍然必须在两个位置进行更改。

考虑一个更现实的示例,让我们有一个方法来完成工作,然后再调用它的其他重载(这可能不是一个完美的示例,但它作为一种常见的操作而浮现在脑海,这很容易说明):

public SendEmail(string to, string message){
  SendEmail(to, message, null);
}

public SendEmail(string to, string message, Credentials c){

  MailClient mc = new MailClient();
  if(c == null){
    if(!to.endsWith("@local"))
      // throw exception; non local email delivery requires a credential
  } else {
    mc.Credentials = c;
  }

  mc.Send(to, message);
}

在这里,我们有一个实现,我们执行一些if语句来部分改变行为,而不是在if / else块中复制整个方法主体,而无需重复代码,并且我们拥有更简单的重载调用,即更广泛的调用

编码中的许多事情都是个人选择,但这就是我希望看到的“为提供复杂方法调用的简化版本而过载”的方式。相比之下,我发现您的两个案例都不具有彼此之间没有任何特殊优势的优势,而这些优势并没有被它们的劣势所抵消。情况1更整洁,但是重复了代码,情况2比必要的更混乱,并且重复了代码,但是部分地针对了“简单签名调用复杂签名”路线

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:找到特定字符并获取子字符串 - java

我有一个字符串4.9.14_05_29_16_21,我只需要获取4.9。数字各不相同,所以我不能简单地获得此char数组的前三个元素。我必须找到最正确的.并将其子字符串化直到那里。我来自Python,因此我将展示Python的实现方法。def foobar(some_string): location = some_string.rfind('.&…

JAVA 8具有任何匹配属性的对象的过滤器列表 - java

我的要求是通过匹配任何属性的字符串来过滤对象列表。例如,假设Contact类具有三个属性:街道,城市,电话。我知道java流过滤器是如何工作的,在这里我必须将输入字符串与每个属性进行比较,如下所示:contactList.stream().filter(contact -> contact.getStreet().equals("dubai&…

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…