java - java中的最终字段继承

标签 java inheritance field final

是否可以让给定的子类在其父类(super class)中初始化静态最终字段?本质上,我希望子类配置所需的类范围变量。不幸的是,abstract 关键字并不完全适用于字段..

最佳答案

不 - 如果有 两个 子类试图做同样的事情,你会期望它如何工作?如果您有静态最终字段,它们必须由声明它们的类初始化。

如果您尝试同时使用静态字段和继承,这通常是开始时出现问题的标志,老实说 - 这两个概念通常不能很好地发挥作用一起。人们经常尝试用静态方法等来“伪造”继承,但结果通常很糟糕——这听起来像是该主题的变体。

如果您能描述一下您的整体情况,我们或许能为您提供更多帮助。顺便说一下,为了可测试性,我会敦促您一般避免静态。它们适用于真正的常量,但如果是配置之类的东西,最好在构造对象时传入相关设置 (IMO)。

编辑:我可以看到四个选项可以更好地模拟您的情况:

  1. 使用注解:见真软的回答
  2. 使 maxHealth 成为一个方法,这样您就可以询问任何玩家他们的最大生命值是多少 - 然后是多态的,因此可以在每个类中被覆盖
  3. 模型 PlayerPlayerClass 分开:

    public class Player {
        private final PlayerClass playerClass;
        private int health; // etc
    }
    
    public class PlayerClass {
        private final int maxHealth; //etc
    }
    

    这样您可以在“玩家类”级别继承,但您不必这样做 - 您可以创建多个 PlayerClass 实例,它们行为 以相同的方式,但具有不同的统计信息...或者您可以子类化 PlayerClass 以提供自定义行为。到那时,您可能根本不需要 Player 的不同子类。

  4. 与想法 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/

相关文章:

java - 无法在框架上显示形状

java - QueryDsl 避免多个 if block

c# - 基类中的虚拟方法使用子类中的静态变量

java - 继承和私有(private)/公共(public)变量

java - 如何找到引用方法的第一个声明方法

java - 强制对象字段仅具有从父类继承的某些值

java - 如何编写自定义标签来读取和打印数组列表?

java - 如何将多列与其他列一起以 JSON 形式返回

jquery - 如果选择了选项,则使用 Jquery 禁用提交按钮

java - 有没有办法用方法初始化静态字段?