簡體   English   中英

如何將有關 class 的 static 數據存儲到

[英]How to store static data about a class to

想象一下,我有一個像這樣的抽象 class :

public abstract class Device {

  public Device(DeviceModel model){
    // ...
  }

  public abstract boolean isBuildable();
}

然后我有一個可能看起來像這樣的實現:

public final class Floor extends Device {
  // ...

  @Override
  public void boolean isBuildable(){
    return false;
  }
}

在這里,每個 Device 子類都向 #isBuildable() 返回 true 或 false。 但是 Floor 的每個實例總是返回 false。 Device 的另一種實現可能會返回 true。 這聽起來像是 static 數據:它不取決於當前實例,而是取決於設備的類型。

目前,我正在創建 class 的實例以獲取其值,因為 #isBuildable() 不是 static。 但我認為這是糟糕的代碼設計。

所以,我在這里想要實現的就像創建abstract static方法。 我見過這個問題沒有太大幫助。 我將強制在 Device 的所有子類中實現#isBuildable(這次是靜態的),以便我可以調用Floor.isBuildable()或其他類似的東西。

在這里我不能控制所有的源,所以我不能使用反射率。 希望你能理解這個奇怪的問題!

如果您需要存儲特定於類(而不是特定於實例)的信息,自定義注釋可能是 go 的方式。

這需要一個 function 使用反射來訪問該信息,這在一個小項目中可能是多余的,但在更大的框架或類似項目中應該沒有問題。

在 Java 中,static 方法不能覆蓋其他 static 方法,所以你想做的事情是不可能的。

由於 Java 沒有真正的類型變量(用於 generics 的類型變量在運行時才存在),您無論如何都需要一個實例來確定調用哪個覆蓋的 ZA81259CEF8E959C624DF1D456E5D327 方法。 假設您有一個 class Device ,它有兩個子類FloorCeiling ,它們都有一個名為foo()的方法。 由於沒有運行時類型變量, T.foo()無法工作,並且Device.foo()Floor.foo()Ceiling.foo()都指定了要調用的方法。

有一些解決方案/解決方法:

  • 通過反射調用正確的方法。 您將丟失任何 static 類型檢查。

  • 引入一個伴隨枚舉或 class ,其中包含有關您的類型的信息。 例如:

     public class DeviceType { private final boolean buildable; private DeviceType(boolean buildable) { this.buildable = buildable; } public boolean isBuildable() { return buildable; } } public class Floor extends Device { public static final DeviceType DEVICE_TYPE = new DeviceType(false); ... }

    現在您可以傳遞Floor.DEVICE_TYPE作為 class 的一種表示,其中包含您想要的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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