gpt4 book ai didi

java - java中的最终字段继承

转载 作者:行者123 更新时间:2023-11-29 07:18:03 25 4
gpt4 key购买 nike

是否可以让给定的子类在其父类(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com