java—有没有可能用“密封方法”细化密封类?

iqih9akk  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(306)

我正在玩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
}

有没有什么方法,我可以实现这一点与新的功能或有任何其他方式,我错过了?

zpjtge22

zpjtge221#

您可以使用包访问类来实现这一点。
将这三个类都放在它们自己的包中,并委派 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中都是有效的。

相关问题