亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 中的抽象常量

Java 中的抽象常量

Helenr 2022-08-17 17:04:51
我想創建一個未在超類中實現的常量,以強制子類實現它。我發現(關于此主題)的最佳解決方案是創建一個將返回常量值的抽象方法。我假設不可能做這樣的事情:abstract final static String Name;但我仍然有希望,因為Java在Serializable接口中使用了這樣的東西。有人知道他們是怎么做到的嗎?有可能在我自己的課堂上復制它嗎?
查看完整描述

5 回答

?
慕尼黑5688855

TA貢獻1848條經驗 獲得超2個贊

這樣的常量不能,因為字段在類的所有實例(包括所有子類的實例)之間共享。下面介紹如何將其實現為非靜態常量:staticstatic


public abstract class Foo {

  public final String name; // Particular value to be defined in subclass


  protected Foo (String name) {

    this.name = name;

  }

}


public class Bar extends Foo {

  public Bar () {

    super ("Zoo"); // Here we define particular value for the constant

  }

}

順便說一句,不是接口的一部分。serialVersionUIDSerializable


查看完整回答
反對 回復 2022-08-17
?
LEATH

TA貢獻1936條經驗 獲得超7個贊

serialVersionUID接口不會強制執行字段存在,因為接口無法強制執行字段的存在。你可以聲明一個實現的類,它將編譯得很好,沒有字段在那里。SerializableSerializableserialVersionUID


檢查字段在工具中是硬編碼的。一個例子是JDK java.io.ObjectStreamClass.getSerialVersionUID()方法,它通過反射加載值:serialVersionUIDserialVersionUID


/**

 * Returns explicit serial version UID value declared by given class, or

 * null if none.

 */

private static Long getDeclaredSUID(Class<?> cl) {

    try {

        Field f = cl.getDeclaredField("serialVersionUID");

        int mask = Modifier.STATIC | Modifier.FINAL;

        if ((f.getModifiers() & mask) == mask) {

            f.setAccessible(true);

            return Long.valueOf(f.getLong(null));

        }

    } catch (Exception ex) {

    }

    return null;

}


查看完整回答
反對 回復 2022-08-17
?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

我不推薦它,但如果你非常需要它,你可以在Checkstyle中創建一個正則表達式檢查,并強迫人們實現靜態變量。


查看完整回答
反對 回復 2022-08-17
?
FFIVE

TA貢獻1797條經驗 獲得超6個贊

當一個類實現沒有您在 IDE 中看到的小消息時,編譯時會發出警告。如果你想創建這樣的東西,你可以,但這個過程似乎很復雜。解決方案就在這個答案中。SerializableserialVersionUIDjavac

它們詳細介紹了,但一般思想是創建注釋和注釋處理器,并在編譯期間使用注釋處理器。我猜你可以使用反射(或者...不是反射,因為它是編譯時間?以查看帶注釋的類是否包含所需的字段。


查看完整回答
反對 回復 2022-08-17
?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

這是我發現的模擬它的最佳方法。Javadoc 防止防止有點不好擴展...但是id子類沒有NAME,它將無法執行


public abstract class Foo {

    protected final String NAME;

    public Foo() {

        String name="";

        try {

            name = (String) this.getClass().getDeclaredField("NAME").get(name);

        } catch (NoSuchFieldException 

                 | SecurityException 

                 | IllegalArgumentException 

                 | IllegalAccessException e) {

            e.printStackTrace();

        }

        NAME = name;

    }

}


public class Bar extends Foo {

    public static final String NAME = "myName";

}


查看完整回答
反對 回復 2022-08-17
  • 5 回答
  • 0 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號