我遇到了一些具有以下结构的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() {
        public void func(String s){
                func(s, true);
        }
        public void func(String s, boolean b){
                //your code here
        }
}

对于默认值,您可以使用

func("my string");

如果您不想使用默认值,可以使用

func("my string", false);

其他回答

不幸的是,是的。

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

不,但你可以很容易地模仿它们。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,因为它很简单。

是=使用Kotlin!))

这是一个笑话;

有六个或更好的问题,例如,最终,你会发现静态工厂模式。。。请参见加密API。排序很难解释,但可以这样想:如果您有构造函数,默认值或其他值,那么传播状态超出大括号的唯一方法是使用Boolean isValid;(以及null作为默认值v失败的构造函数)或抛出一个异常,当从字段用户处获取该异常时,该异常永远不会提供信息。

代码正确,该死,我写了一千行构造函数,做了我需要的。我发现在对象构造中使用isValid——换句话说,两行构造函数——但出于某种原因,我正在迁移到静态工厂模式。我只是觉得如果在方法调用中仍然存在sync()问题,那么可以做很多事情,但默认值可以更好地“替换”(更安全)

我认为我们需要做的是解决空值作为默认值相对于字符串一=新字符串(“”)的问题;作为成员变量,然后在将字符串分配给构造函数之前检查null。

在Java中完成了大量原始的、同温层的计算机科学。

C++等等都有供应商库,是的。由于Java是一个庞大的工具箱,所以它可以在大型服务器上超越它们。研究静态初始化程序块,和我们呆在一起。

类似于方法的构造函数

static void popuping() {
    popuping("message", "title");
}
static void popuping(String message) {
    popuping(message, "title");
}
static void popuping(String message, String title){
    JOptionPane.showMessageDialog(null, message,
            title, JOptionPane.INFORMATION_MESSAGE);
}