gpt4 book ai didi

java - 明确消除Java中重载构造函数的歧义

转载 作者:行者123 更新时间:2023-11-29 08:02:53 26 4
gpt4 key购买 nike

我知道如果我在 Java 中有一个重载方法可以接受几种不同类型的参数,并且我想将 null 传递给该方法,我需要将其显式转换为其中一个接受的类型。我的问题是,是否可以从方法本身中选择在 null 上调用哪个版本的方法(例如,通过添加另一个重载来处理 null)?

我的问题如下 - 我有一个带有接受一个参数的重载构造函数的类:

public class MyClass {

public MyClass(A arg) {
// do something
}

public MyClass(B arg) {
// do something else
}
}

用例是这样的,如果类是用 null 构造的,那么只有构造函数的第二个版本才有意义。但是每次都必须执行 new MyClass((B)null) 很容易出错。如果我不小心使用了对 A 的转换,则会执行错误的构造函数。而且我也不能在我的 A 构造函数中引入以下检查:

if (arg == null) {
this((B)arg);
}

因为 this(...) 不是第一条语句。当然,我可以在这个检查中复制 B 构造函数中的代码,或者引入另一种方法来执行 B 构造函数所做的事情,然后在构造函数中同时调用它并在此检查中,但这似乎不是一个“干净”的解决方案(并且可能并不总是可能的,例如在级联构造函数的情况下)。

有没有办法让我每次都只执行 new MyClass(null) 并让构造函数的 B 版本执行?

我试图添加这个重载,但编译器报错:

public MyClass(null arg) {
this((B)arg);
}

最佳答案

But having to do new MyClass((B) null) every time is error-prone.

如果您打算像那样使用裸构造函数,那是 Java 语言必须提供的最佳机制。

但是您可以通过将 new 调用替换为 static 对象工厂方法来避免这种情况;例如

  public static MyClass newANull() {
return new MyClass((A) null);
}

public static MyClass newBNull() {
return new MyClass((B) null);
}

(显然,您需要更好的方法名称...)


请注意,使用工厂方法还允许您执行诸如每次返回相同的“ANull”或“BNull”MyClass 实例之类的操作……如果这样做是合适的。

关于java - 明确消除Java中重载构造函数的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13336960/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com