这是在没有单例的情况下在许多对象之间共享变量的正确方法吗?

时间:2019-06-17 06:35:59

标签: java design-patterns

因此,我有一个程序,其中几个不同类的许多对象需要从“类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>

0 个答案:

没有答案