2009-07-30 63 views
2

可能重复:
Best Practice: Initialize class fields in constructor or at declaration?初始化成员变量的最佳做法?

我与C#的工作,但是这可能适用于Java(或任何其他语言,允许这种行为为好)......

哪种方式是最好的/最佳做法?假设我总是需要_memberVar

1.

class MyClass 
{ 
    private Dictionary<int, string> _memberVar = new Dictionary<int, string>(); 

    public MyClass() {} 
} 

- 或 -

2.

class MyClass 
{ 
    private Dictionary<int, string> _memberVar = null 

    public MyClass() 
    { 
     _memberVar = new Dictionary<int, string>(); 
    } 
} 

现在让我们说MyClass具有向上的10个...构造函数所以我不想在所有这些构造函数中都有_memberVar = new Dictionary<int, string>();。第一种方式有什么问题吗?由于

编辑: 我意识到我可以链的构造函数,但是这是一个相当复杂的类...一些构造函数调用基,一些呼叫其他的构造已经等等

+0

http://stackoverflow.com/questions/24551/best-practice-initialize-class-fields-in-constructor-or-at-declaration – M4N 2009-07-30 14:21:44

+0

的重复和对不起有关重复... – Polaris878 2009-07-30 14:27:14

回答

2

你不必初始化成员变量,但是如果你这样做不会伤害它。成员变量会自动获取其默认值,通常为对象的null和基元类型的默认值(例如int0)。

至于具有不同的构造函数,您不必在每个版本中重复成员初始化,因为您可以像重载方法一样调用任何其他重载构造函数。

关于最佳实践,亲自我在构造函数中初始化成员变量,因为这是我想要“构造”我的对象到一个稳定的状态。换句话说,即使我会在声明它们的时候初始化成员变量,但是在构造函数被调用时,就好像我正在擦除干净的石板。

0

理想情况下,你应该为此使用依赖注入。这意味着您将它留给您的类的实例化器来创建新的依赖关系实例,并将它们注入到类的新实例中,而不是让类自己创建依赖关系。

0

第一种方法是我通常做的方法,如果所有的构造函数都将它初始化为相同的值,那么这是完全可以接受的。我绝对更喜欢静态变量,以避免显式声明静态构造函数。

1

关于_memberVar在10个构造函数中被初始化:我认为你需要重新考虑你的类。这听起来很过分。如果你在每个构造函数中都做了相同的工作,那么你违反了DRY。相反,尝试采用这种结构:

public class MyClass { 
    Foo _foo; 
    Bar _bar; 
    Baz _baz; 

    public MyClass(Foo foo, Bar bar, Baz baz) { 
     _foo = foo; _bar = bar; _baz = baz; 
    } 

    public MyClass(Foo foo, Bar bar) : this(foo, bar, new Baz()) { } 

    public MyClass(Foo foo) : this(foo, new Bar()) { } 

    public MyClass() : this(new Foo()) { } 
} 

注意,我故意没呼叫到每一个休息的最广泛的构造,而是级联,以便在情况下继承行为默认的变化感为每个。

对于声明中的成员初始化,如果成员不是使用构造函数的参数之一构造的,我更愿意在声明时进行初始化。