因此,我有一个程序,其中几个不同类的许多对象需要从“类X”的对象中读取一些(许多)变量,以为其命名。一种快速而简单的方法是创建一个单例,它不是X本身,而是它可以访问的类。我已经做完了,后来开始感觉很脏,许多人似乎都同意,因此我想为此更改设计。但是,我还没有找到任何替代该模式的想法,只是“不要这样做”并“传递数据”。不过,我希望我的数据是只读的。我还没有提到其他任何模式。
我最好共享这些只读变量,这对我来说似乎很不错,它是使用一个类SharedVars
来共享数据,但以内部类的形式。它位于Data
内部,这是一个外部类,能够修改SharedVars
,封装了对其他类来说是只读的内容。基本上,任何想要读取这些变量的类都需要一个Data.SharedVars
对象:
public class Data {
public static class SharedVars {
private int encapsulatedData;
public int getData() {
return encapsulatedData;
}
}
// no one should touch this but Data:
static private SharedVars sharedData;
Data() {
sharedData = new SharedVars();
}
public SharedVars getDataRef() {
return sharedData;
}
// here's where this class (and only this class, whenever it's told)
// modifies the encapsulated data:
void manipulateData() {
sharedData.encapsulatedData = 5;
}
}
依赖于此的类之一将采用以下形式:
public class Client {
// This class can't access the data directly
// so it'll use Data's getter:
Data.SharedVars vars;
public Client(Data.SharedVars vars) {
this.vars = vars;
// vars.encapsulatedData = 5; // is not allowed, since the field is private (which is what I want)
}
public void go() {
// the proper way to get its hand on the data:
int data = vars.getData();
System.out.println("The data is " + data);
}
}
在此示例中不需要Main,但是无论如何我将其保留在这里:
public class Main {
static Data dataControl;
static Client client;
public static void main(String[] args) {
dataControl = new Data();
client = new Client(dataControl.getDataRef());
dataControl.manipulateData();
client.go();
}
}
这合适吗?或者,这里有什么风险?请注意,我不希望对象自己复制它们,因为它们会一直在变化,而且我不完全喜欢引用以前提到的“类X”的想法。 / p>