簡體   English   中英

是否可以使用“密封方法”改進密封類?

[英]Is it possible to refine sealed classes with "sealed methods"?

我正在玩 java 15 中的預覽密封類,我想知道為什么關鍵字sealednon-sealed只適用於類和接口,而不適用於方法(像其他修飾符一樣)。 我想具體決定哪些方法可以被允許的子類覆蓋可能是有用的。

一個例子:我有一個 class Unit有兩個子類MetricImperial ,它們最終都實現了一個基本功能,這里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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM