如果我有一个抽象类,我打算从中创建子类,那么更好的做法是让抽象类中的字段受到保护,还是让子类使用 setter 和 getter?有什么优点和缺点吗?
例如:
public abstract class MyAbstractClass {
// option A
protected int myProtectedInt;
// option B
private int myPrivateInt;
public void setMyPrivateInt() {}
public int getMyPrivateInt() {}
}
public class MySubClass extends MyAbstractClass {
// etc
}
Run Code Online (Sandbox Code Playgroud)
嗯,这部分是主观的(取决于场景),部分是偏好。我个人从来不向儿童班级开放这个领域。过去,更喜欢带有受保护(或公共,根据需要)的 getter 和 setter 的私有字段对我帮助很大。虽然它在代码中添加了更多字符,并使代码看起来不太直观,但我可以列出我首选方法的一些优点,这些优点可能会说服您开始使用具有私有字段的 getter/setter:
更好的控制:父类确切地知道发生了什么变化以及访问了什么。他们必须使用 setter,而不是让子类(或孙类)直接修改字段,从而为父类提供可能有一天会派上用场的可见性
更好的灵活性:只要保留 getter/setter 的签名,父类就可以灵活地更改字段的维护方式、可能的计算方式甚至重构,而无需影响任何子类。
日志记录、数据访问和验证:getter/setter 方法可以具有编程逻辑来记录或检查数据类型,或者在访问或修改之前或之后执行验证。您可以添加业务逻辑以确保调用者有权读取或写入字段。
更好的描述:可以更好地记录方法(方法的JavaDocs可以比成员变量的JavaDocs更具解释性)
希望这可以帮助。