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


当前回答

没有,但您可以使用生成器模式,如堆栈溢出答案中所述。

如链接答案中所述,生成器模式允许您编写如下代码

Student s1 = new StudentBuilder().name("Eli").buildStudent();
Student s2 = new StudentBuilder()
                 .name("Spicoli")
                 .age(16)
                 .motto("Aloha, Mr Hand")
                 .buildStudent();

其中某些字段可以具有默认值或可选。

其他回答

不幸的是,是的。

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++在编译过程中对它们进行了类型检查。

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

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项提示(考虑静态工厂方法而不是构造函数)

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

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

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

您可以使用以下选项-

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