首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有可能用“密封方法”来精炼密封类?

有没有可能用“密封方法”来精炼密封类?
EN

Stack Overflow用户
提问于 2020-12-02 18:57:16
回答 1查看 198关注 0票数 2

我正在使用java15中的预览密封类,我想知道为什么关键字sealednon-sealed只适用于类和接口,而不适用于方法(就像其他修饰符一样)。我认为明确地决定哪些方法可以被允许的子类覆盖可能是有用的。

例如:我有一个类Unit,它有两个子类MetricImperial,这两个子类最终都实现了一个基本功能,这里是kind()

代码语言:javascript
复制
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(),而是提供一个对所有子类都是最终的实现,除了那些允许覆盖的子类。在我看来,这应该是这样的:

代码语言:javascript
复制
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
}

我有没有办法通过新特性来实现这一点,或者有没有其他我遗漏的方式?

EN

回答 1

Stack Overflow用户

发布于 2020-12-02 21:10:20

您可以使用包访问类来做到这一点。

将这三个类都放在它们自己的包中,并将kind()委托给一个包-私有方法-即既不是公共的也不是受保护的也不是私有的方法。这将只允许该包中的类覆盖它:

代码语言:javascript
复制
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中都有效,无论是否正在使用密封类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65106706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档