【发布时间】:2020-12-02 10:57:15
【问题描述】:
我正在使用 java 15 中的预览密封类,我想知道为什么关键字 sealed 和 non-sealed 只适用于类和接口,而不适用于方法(就像其他修饰符一样)。我想具体决定哪些方法可以被允许的子类覆盖可能很有用。
一个例子:我有一个类Unit,它有两个子类Metric和Imperial,它们最终都实现了一个基本功能,这里是kind()。
public abstract sealed class Unit permits Imperial, Metric {
public abstract String kind ();
}
public abstract non-sealed class Imperial extends Unit {
@Override
public final String kind() { return "imperial"; }
}
public abstract non-sealed class Metric extends Unit {
@Override
public final String kind() { return "metric"; }
}
这行得通。但是,现在我不想在所有子类中实现kind(),而是提供一个对所有子类都是最终的实现,除了那些允许覆盖的子类。在我看来,这看起来像这样:
public abstract sealed class Unit permits Imperial, Metric {
// this is not supported
public sealed String kind () permits Imperial {return "easy"; }
}
public abstract non-sealed class Imperial extends Unit {
@Override
public final String kind() { return "oh my god"; }
}
public abstract non-sealed class Metric extends Unit {
// should not be possible to override kind() here or in any subclass
}
我有什么方法可以通过新功能实现这一点,或者我还缺少其他方法吗?
【问题讨论】:
-
是的,按纪律。密封类意味着您可以控制所有实现,因此您不需要针对其他实现者进行额外的预防,因为它就是您的全部。
-
当然,这是正确的。但是,如果该方法在 Unit 中是抽象的,则实现可能会有些多余。如果不是,我必须在每个允许的类中覆盖它,以确保它对于进一步的子类是最终的。即使有纪律,这可能会在一段时间后的扩展中受到关注。
标签: java java-15 java-sealed-type