在 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
,但据我所知,当 subclass
是 instantiated
时,它们仍然可以用来创建对象。
这是一个简短的例子:
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);
}
}
现在你的子类需要设置高度,因为他们必须调用获取高度的构造函数。
我目前在一所 Java 大学 class 并且对于编码示例,教授正在使用 protected
字段供子 class 访问。
我问这是不是不好的做法,并被告知这是正常的。是这样吗,为什么不对抽象方法使用 setter 和 getter?我认为除非另有要求,否则最好限制尽可能多的信息。
我使用 setter 和 getter 与 abstract
parent 进行了测试,它适用于 abstract
parent class 子 classed。虽然抽象 classes 不能是 instantiated
,但据我所知,当 subclass
是 instantiated
时,它们仍然可以用来创建对象。
这是一个简短的例子:
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);
}
}
现在你的子类需要设置高度,因为他们必须调用获取高度的构造函数。