Java 具有不同对象参数的重载构造函数

Java 具有不同对象参数的重载构造函数,java,oop,constructor,Java,Oop,Constructor,可能重复: 关于用Java编写代码时的“最佳实践”的快速问题。我有一个类,它可以用两种不同类型的对象(一个HashMap或一个单独的类,我称之为SearchTerm)构造。在客户端通过构造函数提供空参数的情况下,我通常有非常好的处理程序,但如果确实发生这种情况,VM会崩溃并说参数不明确。(这很有意义,因为null参数可能引用了任何一个对象。) 这些情况通常如何处理?允许单独的对象作为参数是一种不好的形式吗?除非我误解了什么,否则只有当您尝试以null作为参数调用构造函数时,才会出现这种歧义错误

可能重复:

关于用Java编写代码时的“最佳实践”的快速问题。我有一个类,它可以用两种不同类型的对象(一个HashMap或一个单独的类,我称之为SearchTerm)构造。在客户端通过构造函数提供空参数的情况下,我通常有非常好的处理程序,但如果确实发生这种情况,VM会崩溃并说参数不明确。(这很有意义,因为null参数可能引用了任何一个对象。)


这些情况通常如何处理?允许单独的对象作为参数是一种不好的形式吗?

除非我误解了什么,否则只有当您尝试以
null
作为参数调用构造函数时,才会出现这种歧义错误。如果要解决此问题,可以将参数强制转换为要使用的类,如下所示:

new YourClass((SearchTerm) null);
这样编译器就知道,即使参数是
null
,它也应该将其视为
SearchTerm
null
实例

如果您有一个
SearchTerm
的实例恰好为空,那么应该不会有问题:

SearchTerm searchTerm = null;
new YourClass(searchTerm);

如果编译器知道实例的类型,即使它为null,也应该不会出现歧义错误。

除非我误解了什么,否则只有当您尝试以
null
作为参数调用构造函数时,才会出现此歧义错误。如果要解决此问题,可以将参数强制转换为要使用的类,如下所示:

new YourClass((SearchTerm) null);
这样编译器就知道,即使参数是
null
,它也应该将其视为
SearchTerm
null
实例

如果您有一个
SearchTerm
的实例恰好为空,那么应该不会有问题:

SearchTerm searchTerm = null;
new YourClass(searchTerm);

应该在没有歧义错误的情况下工作,因为编译器知道实例的类型,即使它为null。

这是编译器错误。有什么问题吗?VM应该根据参数类型处理要调用的构造函数。@WilliamVanRensselaer-但事实并非如此。Sal,你能不能用工厂来构造这些对象,让工厂拒绝参数为null的情况?或者,如果null大小写有效,则使用第三个构造函数,该构造函数的参数比工厂使用的少一个。这在以前已经处理过:@DavidWallace-这就是我要找的!我想要一个很好的策略来处理这种情况,而一家工厂似乎会处理好它。谢谢链接Sid。这是一个编译器错误。有什么问题吗?VM应该根据参数类型处理要调用的构造函数。@WilliamVanRensselaer-但事实并非如此。Sal,你能不能用工厂来构造这些对象,让工厂拒绝参数为null的情况?或者,如果null大小写有效,则使用第三个构造函数,该构造函数的参数比工厂使用的少一个。这在以前已经处理过:@DavidWallace-这就是我要找的!我想要一个很好的策略来处理这种情况,而一家工厂似乎会处理好它。谢谢你的链接。