Java中重载构造函数的显式消歧
我知道,如果Java中有一个重载方法可以接受几种不同类型的参数,并且我想将Java中重载构造函数的显式消歧,java,constructor,null,ambiguous,disambiguation,Java,Constructor,Null,Ambiguous,Disambiguation,我知道,如果Java中有一个重载方法可以接受几种不同类型的参数,并且我想将null传递给该方法,那么我需要显式地将其转换为一种接受的类型。我的问题是,是否可以从方法本身中选择在null上调用该方法的哪个版本(例如,通过添加另一个重载来处理null) 我的问题如下-我有一个重载构造函数的类,它接受一个参数: public class MyClass { public MyClass(A arg) { // do something } public My
null
传递给该方法,那么我需要显式地将其转换为一种接受的类型。我的问题是,是否可以从方法本身中选择在null
上调用该方法的哪个版本(例如,通过添加另一个重载来处理null
)
我的问题如下-我有一个重载构造函数的类,它接受一个参数:
public class MyClass {
public MyClass(A arg) {
// do something
}
public MyClass(B arg) {
// do something else
}
}
用例是这样的,如果类是用null
构造的,那么只有第二个版本的构造函数才有意义。但是每次都要做newmyclass((B)null)
很容易出错。如果我不小心使用了对A
的强制转换,那么就会执行错误的构造函数。我也不能在我的A
构造函数中引入以下检查:
if (arg == null) {
this((B)arg);
}
因为这个(…)
不是第一条语句。当然,我可以在这个检查中复制B
构造函数中的代码,或者引入另一种方法来做B
构造函数所做的事情,然后在构造函数和这个检查中调用它,但这似乎不是一个“干净”的解决方案(并且可能并不总是可能的,例如在级联构造函数的情况下)
是否有一种方法可以让我只需执行newmyclass(null)
,并且每次都执行B
版本的构造函数
我试图添加此重载,但编译器抱怨:
public MyClass(null arg) {
this((B)arg);
}
但是每次都要做newmyclass((B)null)
很容易出错
如果要使用这样的裸构造函数,这是Java语言必须提供的最佳机制
但是,您可以通过将新的调用替换为静态的对象工厂方法来避免这种情况;例如
public static MyClass newANull() {
return new MyClass((A) null);
}
public static MyClass newBNull() {
return new MyClass((B) null);
}
(显然,您需要更好的方法名称…)
请注意,使用工厂方法还允许您每次返回相同的“ANull”或“BNull”MyClass
实例……如果这样做是适当的话
但是每次都要做newmyclass((B)null)
很容易出错
如果要使用这样的裸构造函数,这是Java语言必须提供的最佳机制
但是,您可以通过将新的调用替换为静态的对象工厂方法来避免这种情况;例如
public static MyClass newANull() {
return new MyClass((A) null);
}
public static MyClass newBNull() {
return new MyClass((B) null);
}
(显然,您需要更好的方法名称…)
请注意,使用工厂方法还允许您每次返回相同的“ANull”或“BNull”MyClass
实例……如果这样做是适当的。如果a
和B
都是接口,这将起作用
public <T extends Object&A&B> MyClass(T arg)
{
this((B)arg);
}
new MyClass(null); // the 3rd constructor is chosen, which calls the 2nd
公共MyClass(T参数)
{
这((B)arg);
}
new MyClass(null);//选择第三个构造函数,它调用第二个
如果A
和B
都是接口,这将起作用
public <T extends Object&A&B> MyClass(T arg)
{
this((B)arg);
}
new MyClass(null); // the 3rd constructor is chosen, which calls the 2nd
公共MyClass(T参数)
{
这((B)arg);
}
new MyClass(null);//选择第三个构造函数,它调用第二个
有一个调用此((B)null)的无参数构造函数。
?@Kevin这在我的情况下有效,但在一个参数构造函数级联到多个参数构造函数的情况下无效。有一个调用此((B)null)的无参数构造函数
?@Kevin这在我的情况下是可行的,但在一个arg构造函数级联到多个arg构造函数的情况下就不行了。有趣的解决方案,不知道像那样在t
上有多个边界!+1有趣的解决方案,不知道像那样在t
上有多个边界!+1我想不起来这似乎是一个不错的方法。通常使用工厂方法而不是裸构造函数更好吗?我在一些库中看到过这样做,但我自己编写代码时总是喜欢使用构造函数。“通常使用工厂方法而不是裸构造函数更好吗?”-最好在您正在开发的应用程序的上下文中使用最有效的方法…没有想到这一点,但这似乎是一个不错的方法。通常使用工厂方法而不是裸构造函数更好吗?我在一些库中看到过这种方法,但我自己编写代码时总是更喜欢使用构造函数。“通常使用工厂方法而不是裸构造函数更好吗?”-最好使用在您正在开发的应用程序上下文中最有效的方法。。。