如何让两个类共享相同的变量定义

时间:2012-05-09 12:08:38

标签: java xml swing oop

我真正需要的是能够在接口中声明常规变量并在两个类中实现该接口,我不必在每个类中重新声明这些接口(即class.data.variables而不是class .variables)。有什么方法可以达到不同的目标吗?

提供更多细节。基本上,我已经创建了一个小型绘图程序,它将JLabel放在JScrollPane上的JPanel上。因为我对这些JLabel有一个特定的设计(即它们不只是用于绘制它们代表此应用程序的航空公司对象),我有一个扩展JLabel的类并将我的应用程序特定变量添加到它。最后,我使用这些变量读取和编写XML文件,以便加载和保存他们的设计。因为我不能将这个扩展类用于我的XML定义,因为它对父类产生了尖叫,即使我告诉它有NONE作为访问器(我读到有一个bug),我必须创建一个相同的类并复制值用于保存和加载。除了向JLabel扩展类添加变量并忘记将其添加到XML模拟类和后续复制例程之外,没有太多问题。

所以,如果我能创建一个包含额外数据声明的类(比如CellDataRecord.java)并且在两个地方都使用该类(JLabel扩展和XML数据)而不必拥有某些东西,那就太棒了。比如XML.data.CellDataRecordXXX。

2 个答案:

答案 0 :(得分:5)

您可以使用继承或使用接口来执行此操作,其中变量在父类中设置为常量。由于您要扩展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());

答案 1 :(得分:1)

我不确定我是否100%掌握您的问题,但是从描述的前几行开始,您可以定义一个抽象类并让您的类扩展它,而不是实现一个接口。这样,您就可以在抽象类中定义属性,这些属性对所有子类都是通用的。