我遇到了一些具有以下结构的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是否支持这种语法?这两步语法是可取的,有什么原因吗?


当前回答

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

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”;}中重写它们

其他回答

您可以使用以下选项-

public void mop(Integer x) {
  // Define default values
        x = x == null ? 200 : x;
}

如果您真的想要,可以使用null手动检查:

public MyParameterizedFunction(String param1, int param2, boolean param3)
{
    if(param3 == null) {
        param3 = false;
    }
}

然而,我强烈建议使用其他东西,比如重载或静态工厂。也许你可以逃避这一点,但这可能会导致意想不到的行为。例如,代码中可能有错误,因此布尔值永远不会得到值。在这种情况下,您不会得到NullPointerException。相反,它看起来像是被设置为false,调试时可能会非常混乱。

不,但我们有另一种形式的函数重载。

未传递参数时调用

void operation(){

int a = 0;
int b = 0;

} 

在传递“a”参数时调用

void operation(int a){

int b = 0;
//code

} 

在传递参数b时调用

void operation(int a , int b){
//code
} 

而不是使用:

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值等等。

您可以使用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);