需要在子类中初始化一个static final字段

Need to initialize a static final field in the subclasses

我问了一个问题,但是很脏,很多人没看懂。所以,我需要声明一个 final 静态字段,它只会在 subclasses 中初始化。我举个例子:

public class Job {
    public static final String NAME;
}

public class Medic extends Job {

    static {
        NAME = "Medic";
    }
}

public class Gardener extends Job {

    static {
        NAME = "Gardener";
    }
}

像这样。我知道这段代码不会起作用,因为 Job class 中的 NAME 字段需要初始化。我想要做的是在每个 subclass (Medic, Gardener) 中单独初始化该字段。

为什么不在基类中声明一个抽象方法class?

public abstract class Job {
   public abstract String getJobName();
}

然后您可以在每个实现中 return 单独的名称:

public class Medic extends Job {
   @Override
   public String getJobName() {
      return "Medic";
   }
}

public class Gardener extends Job {
   @Override
   public String getJobName() {
      return "Gardener";
   }
}

final static 字段没有多大意义。

你不能这样做。 static 字段在声明它的每个 class 中只有一次实例。由于 MedicGardener 共享相同的 Job superclass,它们也共享相同的 NAME 静态字段。因此你不能分配它两次。

你甚至不能在 subclass 中分配一次,因为 Job class 可能已经加载并初始化,但还没有加载 subclasses .但是,在 class 初始化之后,所有 static final 字段都需要初始化。

你需要这个

public enum Job {
    MEDIC(0),
    GARDENER(1);

    /**
     * get identifier value of this enum
     */
    private final byte value;

    private Job(byte value) {
        this.value = value;
    }

    /**
     * get identifier value of this enum
     * @return <i>int</i>
     */
    public int getValue() {
        return this.value;
    }

    /**
     * get enum which have value equals input string value
     * @param value <i>String</i> 
     * @return <i>Job</i>
     */
    public static Job getEnum(String value) {
        try {
            byte b = Byte.parseByte(value);
            for (Job c : Job.values()) {
                if (c.getValue() == b) {
                    return c;
                }
            }
            throw new Exception("Job does not exists!");
        } catch (NumberFormatException nfEx) {
            throw new Exception("Job does not exists!");
        }
    }

    /**
     * get name of this job
     */
    public String getName() {
        switch (this) {
        case MEDIC:
            return "Medic";
        case GARDENER:
            return "Gardener";
        default:
            throw new NotSupportedException();
        }
    }
}