java - Setting value to abstract private field from subclass
问题描述
I would like to know about the most efficient way to set a value to an abstract private field from a subclass. So, for example, have a field called itemCost
, then I would like to initialize its value to 200 in the subclass.
解决方案
Java 中没有这样的抽象私有字段。只有类和方法可以是抽象的。但是要模拟一个抽象的领域,我相信至少有两种好的方法:
- 方法 (1):在超类中定义一个未初始化
final field
的。并在子类中初始化。这更适合常量(原始)变量,并且在构造函数中初始化变量非常好。当然,它也适用于复杂类型(具有可变内容的类实例,而不是原始类型)。 - 方法 (2):为字段定义一个
abstract setter
强制子类实现/重新定义该方法并进行特定初始化。这更适合变化的字段内容,但不能保证该字段将被所有子类正确初始化。这变得依赖于实现。
方法(一)
abstract class MySuperClass {
final int itemCost;
protected MySuperClass(int _itemCost) {
this.itemCost = _itemCost;
}
}
class MySubClass extends MySuperClass {
public MySubClass() {
super(200);
}
public MySubClass(int itemCost) {
super(itemCost);
}
}
如果你不打电话super(itemCost)
,你会得到一个编译器错误。所以这是非常强制的。
方法(二)
abstract class MySuperClass {
int itemCost;
protected MySuperClass() { }
abstract void setItemCost();
abstract void setItemCost(int _itemCost);
}
class MySubClass extends MySuperClass {
public MySubClass() {
setItemCost();
}
public MySubClass(int itemCost) {
setItemCost(itemCost);
}
@Override
final void setItemCost() {
this.itemCost = 200;
}
@Override
final void setItemCost(int _itemCost) {
this.itemCost = _itemCost;
}
}
如果您有兴趣在实例化后修改值并且正确实现了子类,那么这是一个很好的解决方案。但它是一种更冗长、更不直观且容易出错的解决方案。
推荐阅读
- javascript - Nodejs事件循环?
- function - 从 Go 中的查找表创建对象中变量的函数
- apache-flink - 阅读命令 flink run -m yarn-cluster 的源代码
- python - 在路径问题上移动敌人 Pygame - 塔防游戏
- java - 尝试构建 Ping 功能,当单击按钮时,将向用户返回一个对话框,显示主机是否已启动
- azure - VSCode - 部署 Azure 应用 - 找不到任务错误
- ios - 在 SwiftUI 卡片视图中将 UIImage 裁剪到跨设备的特定区域
- angular - 如何在代码中创建角度模板引用
- laravel - Laravel Spatie 的媒体库:如何下载多个文件并将它们压缩到一个目录中
- html - 如何从 regex101 任务 8 中的字符串中去除所有 HTML 标签?