静态类或实例作为参数?

时间:2013-01-31 11:59:16

标签: java

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

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

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 个答案:

答案 0 :(得分:2)

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

Martin Fowler写了一些关于它的文章:

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

答案 1 :(得分:0)

选择更具可读性的内容。例如,如果您说Framework可以单独存在一次,那么您需要使Framework成为单身人士。这直接表达了您的程序/对象应该做的事情。

不要想到性感,想想沟通。例如,如果我用15世纪的英语与你交谈,你会非常生气。你不是要铲起来的吗?

答案 2 :(得分: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;
    }
}

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

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

    Framework.getSomething();   //Call static method.
}

答案 3 :(得分:-1)

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