在变量声明或构造函数内实例化类

6

可能是重复问题:
AS3中初始化类变量的“适当”位置在哪里?

我想知道是否最好在变量声明时或在构造函数中实例化类?例如:

protected var _errorHandler:ErrorHandler = new ErrorHandler();

或者这个:
protected var _errorHandler:ErrorHandler;

public function someClass() {
_errorHandler = new ErrorHandler();
}

我认为这只是一个小问题,但我希望我的代码尽可能健壮和高效!

谢谢

克里斯


虽然是关于Java的问题,但这个链接应该能回答你的问题:http://stackoverflow.com/questions/292363/choosing-when-to-instantiate-classes - Sam
谢谢,这回答了我的问题。我喜欢在变量声明时立即实例化的观点。 - Christopher Grigg
1个回答

7

在构造函数中进行初始化是更可读的做法,可以轻松地看到何时进行了初始化。最不易读的选项是将它们混合在一起,我不能推荐这样做。

有第三个选项,您会看到AS3程序员使用:

  • 变量声明中没有初始化
  • 空(或几乎为空)构造函数
  • 所有初始化都在一个或多个专用init()函数中完成

此方法有两个优点:

  1. 您可以通过再次调用init轻松重置对象以供重新使用
  2. 您可以绕过AS3不允许像其他类似语言(Java / C ++ / C#)那样重载构造函数的限制。例如,您可能希望能够使用一种或多种不同类型的对象初始化数据结构。

就性能而言,我认为您的两个示例将编译为相同的字节码。 AS3编译器为在构造函数之外的静态声明创建了一个特殊的类初始化程序,但对于在声明时初始化的常规成员变量,我期望它只是将初始化移动到构造函数内部。但它是将它们移动到构造函数之前还是之后?我不记得了,这就是为什么我将可读性列为自己将所有内容放入构造函数的主要原因 :-)


好的回答,尽管我的偏好是在声明时初始化,除非对象不确定会被使用。 - shanethehat
在编程中,使用init()模式会更好。我在所有情况下都使用它。 - Bosworth99
我大部分同意,然而,对象的初始化往往与重置不太相同。从性能上来说,重新创建所有对象比将它们设置为初始状态要昂贵得多。此外,重设类中的某些对象根本不需要设置为其初始状态。 - Rad'Val
@mindnoise:我同意。这就是为什么我在描述中尽量避免使用绝对词语(例如“几乎为空”的构造函数)。当然,并非所有类都有唯一正确的答案,如果有的话,作为软件工程师赚取体面的生活将更加困难!当然,有些情况下,最有效地重用对象的方法是将初始化分成多个函数,例如“一次性”初始化(可能非常适合您的构造函数)和“重新初始化”函数,只重置必要的内容。 - Adam Smith
谢谢,因为我真的不喜欢在构造函数中有任何代码,额外的初始化解决方案似乎是一个好主意,尤其是对于可读性,如果性能没有受到影响。 - Christopher Grigg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接