Java 初始化构造函数中的字段值与字段声明中的字段值

Java 初始化构造函数中的字段值与字段声明中的字段值,java,Java,众所周知,在java和其他一些面向对象编程语言中,字段值可以在构造函数中设置,也可以在字段声明语句中初始化。我想知道以上两种方法的本质区别。什么条件我应该用构造函数初始化字段,什么条件我不应该。 感谢您的帮助。使用参数化构造函数的优点是,您可以根据输入设置字段值,但不能对初始化字段执行相同的操作 因此,如果您想创建具有不同属性值的不同对象,请使用带有参数的构造函数。并在构造函数中指定实例变量的值 如果您只是想让所有实例变量都有一些默认值,那么在声明时分配这些值。惯例是初始化构造函数中的字段。构造

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

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

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


如果您只是想让所有实例变量都有一些默认值,那么在声明时分配这些值。

惯例是初始化构造函数中的字段。构造函数本质上是用来构建对象的。只有这样,构建才意味着其成员的实例化或赋值。这也意味着创建对象的所有逻辑都在一个地方,这是可取的。例如

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.
}
public class NewObj
{
     public static final int EMPTY_OBJ = 1;
     public static final int SPECIAL_OBJ = 2;
}
我们遵循这样的约定,因此当其他程序员查看我们的工作时,他们将立即知道在哪里查找创建类的逻辑。通过将其放在字段声明中(或者更糟的是,在字段声明和构造函数中),您会混淆该约定

我见过例外

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

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.
}
public class NewObj
{
     public static final int EMPTY_OBJ = 1;
     public static final int SPECIAL_OBJ = 2;
}

首选
final
字段,因为它们更容易推理,并且
final
字段只能在构造函数中设置。我建议构造函数中应该包含必填字段

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

如果必须按名称设置字段,那么使用构造函数很难做到这一点。有@ConstructorProperty,但很少有类实现了这一点。Java8将支持通过反射访问参数名,但目前setter更容易

注:有两种选择

  • 您可以使用静态工厂方法。这不仅可以有有意义的名称,还可以返回子类
  • 可以使用生成器类。这为您定义和构造对象提供了更多选项。如果您有许多必填字段,这一点尤其有用

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

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

例如:

class Employee{

String mName;

Employee(String name)
{
mName=name;
}

这有助于您在创建Employee对象时轻松初始化员工姓名。

如果所涉及的字段是
final
(同时不是静态的),则必须在构造函数中对其进行初始化。