我正在玩Java15中的预览密封类,我想知道为什么关键字 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
}
有没有什么方法,我可以实现这一点与新的功能或有任何其他方式,我错过了?
1条答案
按热度按时间zpjtge221#
您可以使用包访问类来实现这一点。
将这三个类都放在它们自己的包中,并委派
kind()
包私有方法,即既不是公共的,也不是受保护的,也不是私有的方法。这将只允许该包中的类重写它: