2013-01-31 167 views
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(); 
    ... 
} 

的第三个可能的解决办法是静态+单。

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

谢谢!

+0

性感?真的吗? – TheWhiteRabbit

+0

检查你的第一个电话代码。我假设,你想调用Framework类的getSomething(),所以你不必传递框架参数?你什么时候调用init()? –

+0

对不起...复制并粘贴失败 – Constantin

回答

2

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

Martin Fowler的写了一些事情:

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

+0

@downvoter:一些阐述将是最受欢迎的? – Peter

+0

愤怒downvoter :-) –

0

转到什么是更具可读性。例如,如果您说Framework可以存在一次,那么您需要将Framework设置为一个单例。这直接表达了你的程序/对象应该做什么。

不要想到性感,想到沟通。例如,如果我用15世纪英语与你交谈,你会很生气。你会不会被铲除?

+0

愤怒downvoter :-D –

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. 
} 
+0

抱歉购买为什么-1? –

+0

Angry Downvoter lol –

+0

简单的单身人士,就像我在帖子中所说的第三种解决方案。我会把它写成LazySingleton,所以只有在需要的时候才会创建类 – Constantin

-1

如果有状态,确保不使用,而不是从静态访问。

+0

愤怒的downvoter –

+0

@Aniket太对了,我很生气。 –