oop - 确定构造函数、初始化和重置方法的任务的最佳实践是什么

标签 oop constructor initialization reset

尽管我是用 Java 设计的,但这是一个常见的 OOP 问题。我并不是想解决某个特定问题,只是想思考一些设计原则。
根据我的经验,我养成了将对象设置分为三个阶段的习惯。

目标是尽量减少:额外的工作、困惑的代码和残缺的可扩展性。


构造

  1. 采取最少的必要行动 创建一个有效的对象,传递一个 存在性测试
  2. 仅“一次”实例化和初始化,永远不会被覆盖,非变量对象在对象的生命周期内不会改变/变化
  3. 初始化最终成员
  4. 本质上是一个运行时 stub

初始化

  1. 使对象变得有用
  2. 实例化并初始化可公开访问的成员
  3. 实例化并初始化作为变量值的私有(private)成员
  4. 对象现在应该通过外部测试而不会生成异常(假设代码正确)

重置

  1. 不实例化任何东西
  2. 为所有变量公共(public)/私有(private)成员分配默认值
  3. 将对象返回到精确状态

一个玩具示例:

public class TestObject {
   private int priv_a;
   private final int priv_b;
   private static int priv_c;
   private static final int priv_d = 4;

   private Integer priv_aI;
   private final Integer priv_bI;
   private static Integer priv_cI;
   private static final Integer priv_dI = 4;  

   public int pub_a;
   public final int pub_b;
   public static int pub_c;
   public static final int pub_d = 4;

   public Integer pub_aI;
   public final Integer pub_bI;
   public static Integer pub_cI;
   public static final Integer pub_dI = 4;   

   TestObject(){
        priv_b = 2;
        priv_bI = new Integer(2);
        pub_b = 2;
        pub_bI = new Integer(2);
   }

   public void init() {
       priv_a = 1;
       priv_c = 3;
       priv_aI = new Integer(1);
       priv_cI = new Integer(3);

       pub_a = 1;
       pub_c = 3;
       pub_aI = new Integer(1);
       pub_cI = new Integer(3);
   }

   public void reset() {
       priv_a = 1;
       priv_c = 3;
       priv_aI = 1;
       priv_cI = 3;

       pub_a = 1;
       pub_c = 3;
       pub_aI = 1;
       pub_cI = 3;
   }  
}

最佳答案

我会以一种不需要“init”方法的方式设计我的类。我认为类的所有方法,尤其是公共(public)方法,应该保证对象在成功完成后始终处于“有效”状态,并且不需要调用其他方法。

对于构造函数来说也是如此。创建对象时,应将其视为已初始化并准备好使用(这就是构造函数的用途,并且有许多技巧可以实现此目的)。否则,安全使用它的唯一方法是检查该对象是否已在每个其他公共(public)方法的开头进行初始化。

关于oop - 确定构造函数、初始化和重置方法的任务的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/592943/

相关文章:

oop - 子类型优于类型类的优点

java - 构造函数应该何时以及如何对实例变量施加限制?

C# 构造函数给出 "Method must have a return type"

c++ - 在没有默认构造函数的情况下初始化类

C++ 全局变量和初始化顺序

c - 未初始化的值 - if_nan 函数

c# - 无法将基类(数据协定)转换为派生类

javascript - 获取方法外部的变量(对象)

netbeans - 构造方法中的"<identifier> expected"

具有多重继承的 C++ 构造函数重载解决方案