我想创建一个未在超类中实现的常量,以强制子类实现它。我发现(关于本主题)的最佳解决方案是创建一个将返回常量值的抽象方法。我认为不可能做这样的事情:
abstract final static String Name;
Run Code Online (Sandbox Code Playgroud)
但是我仍然有希望,因为Java在带有SerialVersionUID的Serializable接口中使用了类似的东西。有人知道他们是怎么做到的吗?是否可以在我自己的课堂上重现?
Mik*_*rov 12
这样的常数不能是static因为static字段在类的所有实例之间共享,包括所有子类的实例。这是将其实现为非静态常量的方法:
public abstract class Foo {
public final String name; // Particular value to be defined in subclass
protected Foo (String name) {
this.name = name;
}
}
public class Bar extends Foo {
public Bar () {
super ("Zoo"); // Here we define particular value for the constant
}
}
Run Code Online (Sandbox Code Playgroud)
BTW,serialVersionUID不是Serializable接口的一部分。
Kar*_*cki 10
serialVersionUID外地存在不被强迫Serializable接口,因为接口不能强制字段的存在。您可以声明一个实现的类Serializable,它将在没有serialVersionUID字段的情况下进行编译。
serialVersionUID工具中对字段的检查进行了硬编码。一个示例是JDK java.io.ObjectStreamClass.getSerialVersionUID()方法,该方法serialVersionUID通过反射加载值:
/**
* Returns explicit serial version UID value declared by given class, or
* null if none.
*/
private static Long getDeclaredSUID(Class<?> cl) {
try {
Field f = cl.getDeclaredField("serialVersionUID");
int mask = Modifier.STATIC | Modifier.FINAL;
if ((f.getModifiers() & mask) == mask) {
f.setAccessible(true);
return Long.valueOf(f.getLong(null));
}
} catch (Exception ex) {
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1103 次 |
| 最近记录: |