是否可以让给定的子类在其父类(super class)中初始化静态最终字段?本质上,我希望子类配置所需的类范围变量。不幸的是,abstract 关键字并不完全适用于字段..
最佳答案
不 - 如果有 两个 子类试图做同样的事情,你会期望它如何工作?如果您有静态最终字段,它们必须由声明它们的类初始化。
如果您尝试同时使用静态字段和继承,这通常是开始时出现问题的标志,老实说 - 这两个概念通常不能很好地发挥作用一起。人们经常尝试用静态方法等来“伪造”继承,但结果通常很糟糕——这听起来像是该主题的变体。
如果您能描述一下您的整体情况,我们或许能为您提供更多帮助。顺便说一下,为了可测试性,我会敦促您一般避免静态。它们适用于真正的常量,但如果是配置之类的东西,最好在构造对象时传入相关设置 (IMO)。
编辑:我可以看到四个选项可以更好地模拟您的情况:
- 使用注解:见真软的回答
- 使
maxHealth
成为一个方法,这样您就可以询问任何玩家他们的最大生命值是多少 - 然后是多态的,因此可以在每个类中被覆盖 模型
Player
和PlayerClass
分开:public class Player { private final PlayerClass playerClass; private int health; // etc } public class PlayerClass { private final int maxHealth; //etc }
这样您可以在“玩家类”级别继承,但您不必这样做 - 您可以创建多个
PlayerClass
实例,它们行为 以相同的方式,但具有不同的统计信息...或者您可以子类化PlayerClass
以提供自定义行为。到那时,您可能根本不需要Player
的不同子类。与想法 3 相同,但使用枚举:
public enum PlayerClass { ELF(10), DWARF(9), HUMAN(5); private final int maxHealth; private PlayerClass(int maxHealth) { this.maxHealth = maxHealth; } }
我个人认为我的偏好是最终选择。您仍然可以覆盖行为,但您有一组固定的可能类 - 这可能相当准确地模拟您的游戏。
关于java - java中的最终字段继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7845305/