在 Java 中使用摘要 Class 中的受保护字段

Using Protected Fields in Abstract Class in Java

我目前在一所 Java 大学 class 并且对于编码示例,教授正在使用 protected 字段供子 class 访问。

我问这是不是不好的做法,并被告知这是正常的。是这样吗,为什么不对抽象方法使用 setter 和 getter?我认为除非另有要求,否则最好限制尽可能多的信息。

我使用 setter 和 getter 与 abstract parent 进行了测试,它适用于 abstract parent class 子 classed。虽然抽象 classes 不能是 instantiated,但据我所知,当 subclassinstantiated 时,它们仍然可以用来创建对象。

这是一个简短的例子:

public abstract class Animal {
    protected int height;
}

public class Dog extends Animal {
    public Dog() {
        height = 6;
    }
}

public class Cat extends Animal {
    public Cat() {
        height = 2;
    }
}

相对于使用:

public abstract class Animal {
    private int height;

    public getHeight() {
        return height;
    }

    public setHeight(int height) {
        this.height = height;
    }
}

public class Dog extends Animal {
    public Dog() {
        setHeight(6);
    }
}

public class Cat extends Animal {
    public Cat() {
        setHeight(2);
    }
}

在您的第一个示例中,只有 Animal 的子classes 可以访问受保护的字段高度。 在您的第二个示例中,任何 class 都可以通过 public setter 方法间接操纵字段高度。 看出区别了吗?

虽然您当然可以两种方式都使用,但 protected 现场方式不太理想,我认为不那么惯用,特别是如果这是您计划共享的库代码。

您可以在 Java 集合 API 以及 Guava 中看到它。您将很难找到具有 protected 字段的 Abstract 类(更不用说任何字段了)。

话虽这么说,但总有例外,您并不总是在编写库代码(即 public api)。

这是我对 protected and/or private 字段和摘要 类 的看法。如果你打算这样做而不是制作一个采用初始值的构造函数:

public abstract class Animal {
    private int height;
    public Animal(int height) { this.height = height; }
    public int getHeight() { return this.height }
}

public class Cat extends Animal {
    public Cat() {
        super(2);
    }
}

现在你的子类需要设置高度,因为他们必须调用获取高度的构造函数。