Java中的抽象常数

Jul*_*ret 17 java

我想创建一个未在超类​​中实现的常量,以强制子类实现它。我发现(关于本主题)的最佳解决方案是创建一个将返回常量值的抽象方法。我认为不可能做这样的事情:

abstract final static String Name;
Run Code Online (Sandbox Code Playgroud)

但是我仍然有希望,因为Java在带有Seri​​alVersionUID的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)