【问题标题】:Initializing Fields Value in Constructor Versus in Fields Declaration [duplicate]在构造函数与字段声明中初始化字段值[重复]
【发布时间】:2013-08-14 19:10:50
【问题描述】:

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

【问题讨论】:

  • 如果有问题的字段是final(同时不是静态的),你必须在构造函数中初始化它。

标签: java


【解决方案1】:

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

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

例如:

class Employee{

String mName;

Employee(String name)
{
mName=name;
}

这可以帮助您在创建员工对象时轻松初始化员工姓名。

【讨论】:

    【解决方案2】:

    final 字段是首选,因为它们更容易推理,final 字段只能在构造函数中设置。我建议必须在构造函数中使用的字段。

    如果您有想要稍后更改的字段,请使用 setter。

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

    注意:有两种选择。

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

    【讨论】:

      【解决方案3】:

      约定是在构造函数中初始化一个字段。构造函数本质上是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;
      }
      

      【讨论】:

        【解决方案4】:

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

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

        如果你只是想让所有的实例变量都有一些默认值,那么在声明时赋值。

        【讨论】:

          猜你喜欢
          • 2016-02-22
          • 2012-04-11
          • 1970-01-01
          • 2020-10-15
          • 1970-01-01
          • 2011-06-22
          • 2017-06-20
          • 2011-02-15
          • 1970-01-01
          相关资源
          最近更新 更多