gpt4 book ai didi

java - 是否可以使用 "sealed methods"改进密封类?

转载 作者:行者123 更新时间:2023-12-05 06:08:35 25 4
gpt4 key购买 nike

我正在玩 java 15 中的预览密封类,我想知道为什么关键字 sealednon-sealed 只适用于类和接口(interface),而不适用于方法(像其他修饰符一样)。我想具体决定哪些方法可以被允许的子类覆盖可能会有用。

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

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
}

有什么方法可以通过新功能实现这一点,或者我还缺少其他方法吗?

最佳答案

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

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

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() 是包私有(private)的,因此只有同一包中的类才能覆盖它。

这适用于任何版本的 Java,无论是否使用密封类。

关于java - 是否可以使用 "sealed methods"改进密封类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65106706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com