gpt4 book ai didi

java - 用静态 block 覆盖静态字段是不好的做法吗?

转载 作者:行者123 更新时间:2023-11-30 08:10:59 26 4
gpt4 key购买 nike

我想创建数据结构来捕捉以下想法:

在游戏中,我想要一个通用的 Skill 类来捕获一般信息,例如技能 ID、冷却时间、法力消耗等。

然后我想拥有定义实际交互和行为的特定技能。所以这些都将扩展自基类 Skill

最后,每个玩家都会有这些特定技能的实例,这样我就可以查看每个玩家的技能状态,最近是否有玩家使用过,等等。

所以我有一个抽象父类(super class) Skill,它定义了一些静态变量,所有技能都有这些变量,然后对于扩展 Skill 的每个单独技能,我使用静态 block 重新分配静态变量。所以我有以下模式:

class A {
static int x = 0;
}

class B extends A {
static {
x = 1;
}
}

...

// in a method
A b = new B();
System.out.println(b.x);

上面打印出 1,这正是我想要的行为。我唯一的问题是系统提示我正在以非静态方式访问静态变量。但是我当然不能那样访问它,因为我只想将技能视为 Skill 而不知道它到底是哪个子类。所以我每次这样做都必须抑制警告,这让我想到这里是否有更好/更整洁的设计模式。

我考虑过让相关变量成为非静态变量,但因为它们在特定技能的所有实例中应该是静态的,所以我觉得它应该是一个静态变量...

最佳答案

您通常应该避免这样使用全局状态。如果您确定字段 x将在基类的 所有 子类型的 所有 实例之间共享,那么放置这样一个字段的正确位置可能是基类以外的其他地方。它可能在其他一些配置对象中。

但即使使用您当前的配置,它也没有意义,因为修改静态变量的任何子类都会使该变量对所有类可见。如果子类B变化 x到 1,然后子类 C将其更改为 2,新值将对 B 可见

我认为按照你在问题中描述的方式,每个子类都应该有自己独立的静态字段。并且在抽象基类中,可以定义一个方法让每个子类实现,以便访问每个字段:

abstract class A {

public abstract int getX();
}

class B extends A {
public static int x = 1;

public int getX() {
return x;
}
}

class C extends A {
public static int x = 2;

public int getX() {
return x;
}
}

关于java - 用静态 block 覆盖静态字段是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31355679/

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