我正在使用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
}我有没有办法通过新特性来实现这一点,或者有没有其他我遗漏的方式?
发布于 2020-12-02 21:10:20
您可以使用包访问类来做到这一点。
将这三个类都放在它们自己的包中,并将kind()委托给一个包-私有方法-即既不是公共的也不是受保护的也不是私有的方法。这将只允许该包中的类覆盖它:
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()是包私有的,因此只有同一包中的类才能覆盖它。
这在任何版本的Java中都有效,无论是否正在使用密封类。
https://stackoverflow.com/questions/65106706
复制相似问题