gpt4 book ai didi

java - 不同形式的方法重载

转载 作者:行者123 更新时间:2023-12-03 10:11:48 24 4
gpt4 key购买 nike

我见过类似的问题。但是,我找不到确切的答案。我想知道根据情况遵循的最佳方法。请解释案例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 - 不同形式的方法重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58387485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com