在构造函数和字段声明中初始化字段值

时间:2013-08-13 08:46:00

标签: java

众所周知,在java和其他一些面向对象的编程语言中,字段值可以在构造函数中设置,也可以在字段声明语句中初始化。我想知道上述两种方式之间的本质区别。我应该用构造函数初始化字段的条件和我不应该有什么条件。 谢谢你的帮助。

4 个答案:

答案 0 :(得分:3)

有争议的构造函数的优点是您可以根据输入设置字段值,但是您不能对初始化字段执行相同的操作。

因此,如果您想要创建具有不同属性值的不同对象,那么请使用带有参数的构造函数。并在构造函数中分配实例变量的值。

如果您只是希望所有实例变量都具有某个默认值,则在声明处分配值。

答案 1 :(得分:1)

约定是初始化构造函数中的字段。构造函数基本上是build对象。只有这样,建筑才意味着它的成员的实例化或分配。它还意味着您创建对象的所有逻辑都在一个地方,这是可取的。例如..

public NewObj(String something, int somethingElse)
{
    this.something = something;
    this.somethingElse = somethingElse;
    // All the logic is in one place. This is especially useful 
    // when dealing with huge classes.
}

我们遵循这样的约定,所以当另一个程序员看到我们的工作时,他们会立即知道在哪里寻找创建类的逻辑。通过将它放在字段声明中(或者更糟糕的是,在字段声明和构造函数中),您会混淆该约定。

我见过的例外

在类中创建static final变量时,我发现它们通常是在字段声明中创建的。例如..

public class NewObj
{
     public static final int EMPTY_OBJ = 1;
     public static final int SPECIAL_OBJ = 2;
}

答案 2 :(得分:1)

final字段是首选字段,因为它们更易于推理,final字段只能在构造函数中设置。我建议强制字段应该在构造函数中。

如果您希望以后能够更改字段,请使用setter。

如果你必须按名称设置字段,那么使用构造函数就没有简单的方法。有@ConstructorProperties但很少有类实现了这个。 Java 8将支持通过反射访问参数名称,但是现在setter更容易。

注意:有两种选择。

  • 您可以使用静态工厂方法。这不仅可以有有意义的名称,而且可以返回子类
  • 您可以使用构建器类。这为您定义和构造对象提供了更多选择。如果您有许多必填字段,这将特别有用。

答案 3 :(得分:0)

使用带有参数的构造函数,您可以在创建对象期间使用提供的输入自定义值初始化字段。

当您希望字段具有不同的值时,这通常很有用。

例如:

class Employee{

String mName;

Employee(String name)
{
mName=name;
}

这可以帮助您在创建Employee Object时轻松初始化Employee名称。