任何人都可以解释在构造函数中初始化实例变量的优点,在构造对象并调用相应的setter方法之后我们可以做同样的事情。
答案 0 :(得分:1)
如果您依赖外部代码来初始化成员变量,那么从逻辑上讲,您的程序可能与使用构造函数时一样正确,但您缺少OO设计的全部内容。
您作为OO开发人员的目标是将您的代码分解为自包含的类,这些类在外部显示为黑盒子。外部代码不应该知道内部有哪种成员变量。外部代码唯一需要依赖于类的公共接口。如果你遵循SOLID原则,你应该确保你的类暴露MINIMAL数量的函数。这样,您就可以为消费者提供干净的抽象界面,而在您的代码中可以像您希望的那样复杂。
您甚至可能会确定您的课程如此之大,以至于您希望将其分解为多个类并重新排列数据/功能以便整体设计更好地流动。如果你有外部代码直接操纵你的数据成员,现在进行成像。
答案 1 :(得分:1)
是的,你可以通过setter做同样的事情,但你的类会不一致,直到你设置所有必需的变量,而且如果暴露了setter,任何人都可以在setter调用后更改变量(这可能是要求,但你可以添加检查设置器)
在构造函数中获取变量的优点是,您可以保证仅使用有效值创建对象。
您也可以考虑静态工厂而不是构造函数 - 阅读Item 2 - Creating and Destroying Objects from effective java.
答案 2 :(得分:0)
朴素的setter / getter方法实际上是面向对象编程的破坏。 oo有什么意义?创建一个类来管理其主题的复杂性,而无需在类之外的代码知道类的工作方式。
通过添加getter / setter,你基本上暴露了类的工作方式,而没有实际暴露成员变量,这实际上并不是一件好事。
为了方便起见,我们常常这样做,但实际上并不是最好的主意。
考虑以下情况,您想要为汽车建模,并想知道什么时候需要换油。假设您添加方法
Date getLastOilChangeDate()
void setLastOilChangeDate(Date changeDate)
int getMileageAtLastOilChange()
void setMileageAtLastOilChange(int mileage)
基本上使用成员变量的值。
好像没错?但它真的不好。您正在揭露汽车如何确定是否需要向外界换油,而当汽车确定该信息时,世界的业务并非如此。为什么呢?也许一辆车在2015年出现,但这种方式不起作用。也许它有一个油污传感器,可以持续监控油的状态,并在需要更换油时进行基础测量。
现在上述两种方法都没有任何价值。
如果你改为添加
boolean needsOilChange()
方法,该类的接口即使执行也不必改变。