无参数构造函数v / s带有参数的构造函数

时间:2011-12-02 04:31:57

标签: java

以下哪一个更好或更优选

new Object();  
Object.setValue1("1");  
Object.setValue2("2");  
Object.setValue3("3");  

new Object("1","2","3");

7 个答案:

答案 0 :(得分:3)

(我假设您正在讨论自己的类的设计,而不是如何使用其他已经设计的类。)

两者都不总是“更好”,这取决于对象的性质和(在某种程度上)你喜欢的风格。

如果一个对象在没有外部信息的情况下不能有一个有意义的状态,那么要求构造函数中的信息是有意义的,因为那样就无法创建状态无效的实例。

然而,具有尽可能少的信息的构造函数在使类易于在各种情况下使用方面是有用的。如果类是零参数构造函数是可行的并且不会使类复杂化,那么它在支持各种用例方面是很好的,包括将实例构建为解析其他结构的一部分的情况(JSON, XML等。)。

答案 1 :(得分:2)

还有第三个选项建立在使用fluent interfaces

的基础上
MyObject obj = new MyObject().setValue1("1").setValue("2").setValue("3");

我个人喜欢这种方法但是如果参数的数量很短并且在构造时已知并且参数的变化可能组合很短,那么我将在构造函数上采用参数路径。我想大多数人会同意12个构造函数重载是眼睛疼痛。

答案 2 :(得分:1)

取决于您是否知道对象构建时的值。

如果是,则使用构造函数版本,否则则必须使用其他版本。

当然,通过构造函数版本初始化更快,因为它只涉及3个函数调用的一个函数调用,而且它更符合逻辑。

答案 3 :(得分:1)

在构造函数中调用它总是更好的性能如果你已经知道了值。

答案 4 :(得分:1)

然后是我的首选替代方案。 Thing是某个界面的名称。它创建了一个匿名类。

Thing createThing ( final int val1 , final int val2 , final int val3 )
{
         return new Thing ( )
         {
                // can use val1, val2, val3
         } ;
}

答案 5 :(得分:0)

这一切都取决于应用程序。

调用参数化构造函数将是一个好主意,如果在编译时你知道给变量赋予什么值,而不是调用Setters。因为你正在调用3个setter方法并且在参数化构造函数中,所以你只是自己传递给cnostructor。

但是如果在编译时你不知道要给出什么值,那么如何调用paramterized构造函数。

但是对于初始化,最好调用参数化构造函数。

答案 6 :(得分:0)

存在语义差异。如果(1)您正在实例化具有初始状态的对象。在(2)中,您正在更改现有实例的状态(3次)。这是一个小的差异,但在更复杂的系统中可能变得非常重要(特别是如果您依赖各种JavaBean约定)。但是,无论是错还是更好。