我只是想知道最好的解决方案是什么(类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();
...
}
第三种解决方案可能是静态+单身。
我现在想知道的是,哪种更好,更干净(也许是性感)的解决方案,或者您更喜欢哪种解决方案?
谢谢!
答案 0 :(得分:2)
在许多情况下,单例优于静态类,因为基本上,单例是可替换的,因此更容易进行测试。
Martin Fowler写了一些关于它的文章:
答案 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)
如果它有状态,请确保不使用,并且无法从静态访问。