0

我只是想知道最好的解决方案是什么(类框架只能存在一次,它包含配置等)

让我们假设以下(静态):

public class Framework {
    private Framework() {}

    private static String something;
    private static Object somethingElse;

    public static synchronized void init() {
        something = "something";
        somethingElse = new SuperFancyObject();
    }

    public static String getSomething() { return something; }
    public static Object getSomethingElse() { return somethingElse; }
}

现在我可以通过调用在任何地方使用该类中的所有方法:

public void invoke(Request request, Response response) {
    ...
    Framework.getSomething();
    ...
}

另一个解决方案是:

public class Framework {
    private static String something;
    private static Object somethingElse;

    public Framework() {
        something = "something";
        somethingElse = new SuperFancyObject();
    }

    public String getSomething() { return something; }
    public Object getSomethingElse() { return somethingElse; }
}

所以现在,要使用它,我必须将对象/类作为参数传递:

public void invoke(Framework framework, Request request, Response response) {
    ...
    framework.getSomething();
    ...
}

第三种解决方案可能是静态+单例。

我现在想知道的是,哪个是更好、更干净(也许是性感)的解决方案,或者你更喜欢哪个?

谢谢!

4

4 回答 4

2

在许多情况下,单例比静态类更可取,因为基本上,单例是可替换的,因此更容易进行测试。

Martin Fowler 写了一些关于它的东西:

http://martinfowler.com/bliki/StaticSubstitution.html

于 2013-01-31T12:03:02.980 回答
0

你可以改变你的班级:

public class Framework {

    private String something;

    /** Singleton instance */
    private static Framework iSingleton = new Framework();     // SINGLETON

    protected Framework(){
          //init
     }

    public static String getSomething() {
         return iSingleton.something;
    }
}

在您的调用方法中,我不需要框架实例。你可以这样称呼:

public void invoke(Framework framework, Request request, Response response) {

    Framework.getSomething();   //Call static method.
}
于 2013-01-31T12:07:26.593 回答
0

选择更具可读性的内容。例如,如果您说Framework可以单独存在一次,那么您需要制作Framework一个 Singleton。这直接表达了您的程序/对象应该做什么。

不要考虑性感,要考虑交流。例如,如果我用 15 世纪的英语对你说话,你会非常生气。你不会被铲吗?

于 2013-01-31T12:03:53.183 回答
-1

如果它有状态,请确保不使用并且不能从静态访问。

于 2013-01-31T12:07:46.943 回答