我真正需要的是能够在接口中声明常规变量并在两个类中实现该接口,我不必在每个类中重新声明这些接口(即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());