我遇到了一些具有以下结构的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方法调用生成器自动生成具有默认值的生成器。

只需将@GenerateMethodInvocationBuilder添加到类或接口,并将@Default添加到需要默认值的方法中的参数。编译时将使用您在注释中指定的默认值生成生成器。

@GenerateMethodInvocationBuilder
public class CarService {
 public CarService() {
 }

 public String getCarsByFilter(//
   @Default("Color.BLUE") Color color, //
   @Default("new ProductionYear(2001)") ProductionYear productionYear,//
   @Default("Tomas") String owner//
 ) {
  return "Filtering... " + color + productionYear + owner;
 }
}

然后可以调用这些方法。

CarService instance = new CarService();
String carsByFilter = CarServiceGetCarsByFilterBuilder.getCarsByFilter()//
  .invoke(instance);

或者将任何默认值设置为其他值。

CarService instance = new CarService();
String carsByFilter = CarServiceGetCarsByFilterBuilder.getCarsByFilter()//
  .withColor(Color.YELLOW)//
  .invoke(instance);

其他回答

这可以在Scala中实现,Scala在JVM上运行,并与Java程序兼容。http://www.scala-lang.org/

i.e.

class Foo(var prime: Boolean = false, val rib: String)  {}

它不受支持,但有几个选项,如使用带有语法糖的参数对象模式:

public class Foo() {
    private static class ParameterObject {
        int param1 = 1;
        String param2 = "";
    }

    public static void main(String[] args) {
        new Foo().myMethod(new ParameterObject() {{ param1 = 10; param2 = "bar";}});
    }

    private void myMethod(ParameterObject po) {
    }
}

在这个示例中,我们使用默认值构造ParameterObject,并在类实例初始化部分{param1=10;param2=“bar”;}中重写它们

不,您找到的结构是Java如何处理它(即,使用重载而不是默认参数)。

对于构造函数,请参阅《有效Java:编程语言指南》的第1项提示(考虑静态工厂方法而不是构造函数)

如果过载变得复杂。对于其他方法,重命名某些案例或使用参数对象可能会有所帮助。

这是当你有足够的复杂性,难以区分的时候。一种确定的情况是,您必须使用参数的顺序进行区分,而不仅仅是数字和类型。

没有,但最简单的实现方法是:

public myParameterizedFunction(String param1, int param2, Boolean param3) {

    param3 = param3 == null ? false : param3;
}

public myParameterizedFunction(String param1, int param2) {

    this(param1, param2, false);
}

或代替三元运算符,可以使用以下条件:

public myParameterizedFunction(String param1, int param2, Boolean param3) {

    if (param3 == null) {
        param3 = false;
    }
}

public myParameterizedFunction(String param1, int param2) {

    this(param1, param2, false);
}

它在java中不受支持,例如Kotlin在其他语言中也不受支持。