2011-08-17 165 views
4

何时应该传递参数给对象的构造函数?您使用哪些标准将它们传递给构造函数而不是对象方法中的参数?OOP对象构造函数参数

回答

0

通常,在使用new关键字实例化类时,将参数传递给类构造函数(这可能因语言而异)。

例如(选择了对C /的Java/C#风格在这里)

MyClass class = new MyClass(arg1, arg2, arg3); 

在重新阅读你的问题,我倾向于使用构造函数的参数为​​绝对需要的资源。这样,你就知道你的对象必须有某些可用的属性或资源。

+0

“...需要的资源......”我想过但不知道:) – thom

1

当我的对象非常简单(1或2个属性)我可以提供一个构造函数与这些参数。

但大部分时间,默认的构造函数和我设置我的属性与setters。

+0

好吧,一个简单的对象是一个标准......谢谢。 – thom

+0

这不是一个非常强大的设置,可能会导致nullPointer错误。 (想象别人使用你的班级,但他们不知道他/她需要用setter设置所有内容)。 – Rob

+0

好吧,好点,太多的Spring和依赖注入;-)但在复杂的对象与依赖关系的情况下,我会使用生成器模式,而不是构造函数与10个论据。 – Cygnusx1

0

基本上你想要在构造器中初始化对象的所有基本构建块。 但有时,该对象包含许多元素,从而使构造函数的参数列表太长。 我遵循以下指导原则:如果构造函数的参数列表多于5个元素,则将新对象的初始化分为构造函数参数&设置方法。

3

将事情传递给构造函数,它们是对象的不可变属性。如果可能,请使所有对象属性不可变。充分考虑到这一点,这可以使整个对象不可变。

在构造时分配的不可变属性避免了各种竞争条件(特别是在多线程环境中),并有助于确保对象始终一致,从而消除了多种错误的可能性。通过强制在构建时定义属性,可以避免大量的错误检查代码。一旦整个对象不可变,就有机会共享等价对象,提高内存性能。

如果一个参数不是对象的不可变属性,那么在构造函数中指定它只是一个方便。一般来说,它应该被赋予一个setter来减少代码的复杂性(因为无论如何setter都是必需的)。如果构造函数经常被调用,那么参数的方便可能值得这个额外的复杂性。

+0

不可变?像数据库连接到模型对象?谢谢。 – thom

+1

不可变意味着对象不能以呼叫者可见的方式改变。如果我要求一个不变的字符串作为其第三个字符,那么这将是字符串整个生命周期的第三个字符。可变字符串是可以随时间变化的字符串。诸如缓存之类的内部数据结构不是可变性的一部分,因此它并不意味着对象的文字内存不会改变。但是从外部世界来看,对于同样的问题你总能得到同样的答案。 http://en.wikipedia.org/wiki/Immutable_object –