需要在子类中初始化一个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 中只有一次实例。由于 Medic
和 Gardener
共享相同的 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();
}
}
}
我问了一个问题,但是很脏,很多人没看懂。所以,我需要声明一个 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 中只有一次实例。由于 Medic
和 Gardener
共享相同的 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();
}
}
}