[英]Is it possible to refine sealed classes with "sealed methods"?
我正在玩 java 15 中的预览密封类,我想知道为什么关键字sealed
和non-sealed
只适用于类和接口,而不适用于方法(像其他修饰符一样)。 我想具体决定哪些方法可以被允许的子类覆盖可能是有用的。
一个例子:我有一个 class 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
}
有什么方法可以通过新功能实现这一点,或者我还缺少其他方法吗?
您可以使用包访问类来执行此操作。
将所有三个类放在它们自己的 package 中,并将kind()
委托给一个包私有方法——即既不是公共的也不是保护的也不是私有的方法。 这将只允许 package 中的类覆盖它:
package com.example.units;
public abstract sealed class Unit permits Imperial, Metric {
public final String kind () {
return kindImpl();
}
String kindImpl() { return "easy"; }
}
package com.example.units;
public abstract class Imperial extends Unit {
@Override
String kindImpl() { return "imperial"; }
}
kindImpl()
是包私有的,因此只有同一个 package 中的类才能覆盖它。
这适用于 Java 的任何版本,无论是否使用密封类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.