簡體   English   中英

如何讓兩個類共享相同的變量定義

[英]How can I have two classes share the same variable definitions

我真正需要的是能夠在接口中聲明常規變量並在兩個類中實現該接口,我不必在每個類中重新聲明這些接口(即class.data.variables而不是class.variables) 。 有什么方法可以達到不同的目標嗎?

提供更多細節。 基本上,我已經創建了一個小型繪圖程序,它將JLabel放在JScrollPane上的JPanel上。 因為我對這些JLabel有一個特定的設計(即它們不只是用於繪制它們代表此應用程序的航空公司對象),我有一個擴展JLabel的類並將我的應用程序特定變量添加到它。 最后,我使用這些變量讀取和編寫XML文件,以便加載和保存他們的設計。 因為我不能將這個擴展類用於我的XML定義,因為它對父類產生了尖叫,即使我告訴它有NONE作為訪問器(我讀到有一個bug),我必須創建一個相同的類並復制值用於保存和加載。 除了向JLabel擴展類添加變量並忘記將其添加到XML模擬類和后續復制例程之外,沒有太多問題。

因此,如果我可以創建一個包含額外數據聲明的類(比如CellDataRecord.java)並且在兩個地方都使用該類(JLabel擴展和XML數據)而不必使用類似XML的東西,那將是很棒的。 data.CellDataRecordXXX。

您可以使用繼承或使用接口來執行此操作,其中變量在父類中設置為常量。 由於您要擴展JLabel,因此應在兩個類上實現接口:

public interface MyInterface {
    int someint = 9;
}

public class MyClass1 extends JLabel implements MyInterface {
    //this class has access to `someint`
}

public class MyClass2 extends JLabel implements MyInterface {
    // also has access to `someint`
}

編輯

由於您希望能夠從不同的類更改相同的變量,因此您必須確保不更改副本並更改相同的變量,因此您應該在變量上使用volatile關鍵字向java指示所有線程都應該在更新之前檢查該值。

現在,您需要一個單獨的類,以便可以從其他類生成實例以獲取值。 您必須使用static關鍵字來確保為所有類實例保留一個副本。

public class MyVariableWrapper {
    public static volatile int some_var = 9;
    public void updateSomeVar(int newvar) {
         some_var = newvar;
    }
    public int getSomeVar() { return some_var; }
}

現在其他兩個類就是這樣做的:

public class MyClass1 extends JLabel {
    MyVariableWrapper myVariableWrapper;
    MyClass1() {
        super();
        myVariableWrapper = new MyVariableWrapper();
        // now I have access to `some_var`
    }
}

public class MyClass2 extends JLabel {
    MyVariableWrapper myVariableWrapper;
    MyClass2() {
        super();
        myVariableWrapper = new MyVariableWrapper();
        // now I have access to the same `some_var` as MyClass1
    }

    // this is a wrapper method for your convenience
    // since you don't like the excess code when accessing the variable
    public int getSomeVar() {
        return myVariableWrapper.some_var;
        // or myVariableWrapper.getSomeVar();
    }
    public void setSomeVar(int newvar) {
        myVariableWrapper.some_var = newvar;
        // or myVariableWrapper.setSomeVar(newvar);
    }
}

現在你可以這樣做:

MyClass2 myClass2 = new MyClass2();
System.out.println(""+myClass2.getSomeVar());

我不確定我是否100%掌握您的問題,但是從描述的前幾行開始,您可以定義一個抽象類並讓您的類擴展它,而不是實現一個接口。 這樣,您就可以在抽象類中定義屬性,這些屬性對所有子類都是通用的。

暫無
暫無

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

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