尽管我是用 Java 设计的,但这是一个常见的 OOP 问题。我并不是想解决某个特定问题,只是想思考一些设计原则。
根据我的经验,我养成了将对象设置分为三个阶段的习惯。
目标是尽量减少:额外的工作、困惑的代码和残缺的可扩展性。
构造
- 采取最少的必要行动 创建一个有效的对象,传递一个 存在性测试
- 仅“一次”实例化和初始化,永远不会被覆盖,非变量对象在对象的生命周期内不会改变/变化
- 初始化最终成员
- 本质上是一个运行时 stub
初始化
- 使对象变得有用
- 实例化并初始化可公开访问的成员
- 实例化并初始化作为变量值的私有(private)成员
- 对象现在应该通过外部测试而不会生成异常(假设代码正确)
重置
- 不实例化任何东西
- 为所有变量公共(public)/私有(private)成员分配默认值
- 将对象返回到精确状态
一个玩具示例:
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/