[英]Is it possible to refine sealed classes with "sealed methods"?
我正在玩 java 15 中的預覽密封類,我想知道為什么關鍵字sealed
和non-sealed
只適用於類和接口,而不適用於方法(像其他修飾符一樣)。 我想具體決定哪些方法可以被允許的子類覆蓋可能是有用的。
一個例子:我有一個 class 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
}
有什么方法可以通過新功能實現這一點,或者我還缺少其他方法嗎?
您可以使用包訪問類來執行此操作。
將所有三個類放在它們自己的 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.