我遇到了一些具有以下结构的Java代码:

public MyParameterizedFunction(String param1, int param2)
{
    this(param1, param2, false);
}

public MyParameterizedFunction(String param1, int param2, boolean param3)
{
    //use all three parameters here
}

我知道,在C++中,我可以为参数指定默认值。例如:

void MyParameterizedFunction(String param1, int param2, bool param3=false);

Java是否支持这种语法?这两步语法是可取的,有什么原因吗?


当前回答

不。一般来说,Java没有太多(任何)语法糖,因为他们试图制作一种简单的语言。

其他回答

一个想法是使用字符串。。。参数

public class Sample {
   void demoMethod(String... args) {
      for (String arg : args) {
         System.out.println(arg);
      }
   }
   public static void main(String args[] ) {
      new Sample().demoMethod("ram", "rahim", "robert");
      new Sample().demoMethod("krishna", "kasyap");
      new Sample().demoMethod();
   }
}

输出

ram
rahim
robert
krishna
kasyap

从…起https://www.tutorialspoint.com/Does-Java-support-default-parameter-values-for-a-method

不,但你可以很容易地模仿它们。C++中的内容是:

public: void myFunction(int a, int b=5, string c="test") { ... }

在Java中,它将是一个重载函数:

public void myFunction(int a, int b, string c) { ... }

public void myFunction(int a, int b) {
    myFunction(a, b, "test");
}

public void myFunction(int a) {
    myFunction(a, 5);
}

前面提到过,默认参数导致函数重载中出现不明确的情况。这根本不是真的,我们可以在C++的例子中看到:是的,也许它会产生模棱两可的情况,但这些问题可以很容易地处理。它根本不是用Java开发的,可能是因为创建者想要一种像C++那样简单得多的语言——如果他们有权利的话,这是另一个问题。但我们大多数人并不认为他使用Java,因为它很简单。

而不是使用:

void parameterizedMethod(String param1, int param2) {
    this(param1, param2, false);
}

void parameterizedMethod(String param1, int param2, boolean param3) {
    //use all three parameters here
}

您可以通过使用一个方法来利用java的可选功能:

void parameterizedMethod(String param1, int param2, @Nullable Boolean param3) {
    param3 = Optional.ofNullable(param3).orElse(false);
    //use all three parameters here
}

主要区别在于,必须使用包装器类而不是原始Java类型来允许空输入。布尔值而不是布尔值,整数而不是int值等等。

不幸的是,是的。

void MyParameterizedFunction(String param1, int param2, bool param3=false) {}

可以用Java 1.5写成:

void MyParameterizedFunction(String param1, int param2, Boolean... params) {
    assert params.length <= 1;
    bool param3 = params.length > 0 ? params[0].booleanValue() : false;
}

但是否应该取决于您对编译器生成

new Boolean[]{}

每次通话。

对于多个默认参数:

void MyParameterizedFunction(String param1, int param2, bool param3=false, int param4=42) {}

可以用Java 1.5写成:

void MyParameterizedFunction(String param1, int param2, Object... p) {
    int l = p.length;
    assert l <= 2;
    assert l < 1 || Boolean.class.isInstance(p[0]);
    assert l < 2 || Integer.class.isInstance(p[1]);
    bool param3 = l > 0 && p[0] != null ? ((Boolean)p[0]).booleanValue() : false;
    int param4 = l > 1 && p[1] != null ? ((Integer)p[1]).intValue() : 42;
}

这与C++语法相匹配,后者只允许在参数列表的末尾使用默认参数。

除了语法之外,还有一个不同之处,即它对传递的默认参数进行了运行时类型检查,而C++在编译过程中对它们进行了类型检查。

直接的答案是否定的。

这些答案相当陈旧,主要讨论了即使java没有直接的默认方法参数,我们也可以选择哪些选项。

我们可以用java中的函数式编程轻松地处理这个场景。

我们可以使用java函数式编程的方法currying,我认为它可以最好地用于需要使用默认参数的场景。

在以下情况下,我们可能需要一个默认参数。。。例子:创建一个对两个不同对象有效的方法,并返回计算结果

int mutiply(int a,int b){

      return a*b;

  }

如果我们想有一个乘2的方法,我们必须重写如下方法

int mutiply(int a){

      mutiply(a, 2); // as can not write mutiply(int a,b=2)

  }

上面,2是b的默认值,但它是固定的。如果我们想乘以3,现在我们不能再重载了,而且有多个这样的方法确实很奇怪。

这是我们可以使用方法currying技术的时候。

Currying方法是将多参数函数转换为多个函数的方法,每个函数都接受一个参数。

创建Curried方法的步骤

编写一个接受单个参数并返回另一个参数的函数函数,如下所示。函数<Integer,函数<Integer>>multiply=a->{返回b->a*b;};让我们简化并理解上述方法。

Above方法只接受一个整数Argument,并返回另一个函数,其中一个参数a作为默认值,b作为变量。如果您感到困惑,并开始思考该方法如何使用调用者函数中的变量,而不知道闭包…

“闭包是指在其词汇上下文中引用自由变量的函数。”在这里,在本例中,闭包是对变量multiply进行操作时返回的函数,它有一个自由变量a,它具有调用函数的词法上下文。

返回乘法方法或修复其中一个参数的默认值。//乘法在第一步中定义multiplyByTwo=多重应用(2)multiplyByThree=multiply.apply(3);multiplyByFour=多重应用(4);;等等…将第二个变量传递给返回的函数以获得结果。multiplyByTwo.apply(2)//后果multiplyByTwo.apply(3)//结果6multiplyByThree.应用(2)//结果6multiplyByThree.应用(3)//结果9multiplyByFour.应用(2)//结果8multiplyByFour.应用(3)//结果124

你可以在这里找到我的原始帖子。。。https://www.linkedin.com/pulse/can-we-have-default-method-parameter-java-rajat-singh/?trackingId=yW84I1fzT6WGStrNPAWn4w%3D%3D