通过静态方法访问单例的字段

时间:2011-12-27 10:37:58

标签: java android static singleton

我有一个单身人士课程。

当访问课程的方法时,我可以选择两种可能性。

  1. 将这些方法创建为特定于实例的,然后获取实例并调用它们
  2. 将这些方法创建为静态并调用它们,然后它们将获取实例
  3. 例如:

    Class Test{
    
     private int field1;
    
     Test instance;
    
     private Test(){};
    
     private Test getInstance(){
        if (instance == null)
           instance = new Test();
        return instance;
     }
    
     public int method1() { return field1;}
     public static int method2() {return getInstance().field1;}
    }
    

    现在,我可以写其他地方

     int x = Test.getInstance().method1();
     int y = Test.method2();
    

    哪个更好? 我可以想到第三种方法,我在静态方法中直接使用“instance”,然后捕获异常,如果它是null并实例化它然后重新调用它自己。

    理论上,我可以让整个静止。 但是,这会在将状态保存在活动结束时产生问题,因为序列化不会保存静态。

4 个答案:

答案 0 :(得分:2)

你应该避免让一切都变得静止。有些人甚至会说单身人士没有完成。

答案 1 :(得分:2)

我认为第一个更清洁。

但是,请记住,在某些极端情况下,Android可能会杀死您的静态实例。请参阅此示例:http://code.google.com/p/acra/

我找到的解决方法是在Application类中保留对单例的引用。不过,我不知道这是多么容易出问题。

答案 2 :(得分:2)

单例模式的重点是您可以更改实现。在大多数情况下,您可以使用它来保持在此功能的某些其他实现中“挂钩”的可能性。

阅读:在决定采用setInstance方法的单身人士计划时,不仅仅是getInstance。 - 如果这没有意义,只需使用普通的静态类。

另一方面,单身人士已经过时了,如果你想成为时髦的话。搜索“消除全局状态”。有一些谷歌赞助的谈话也是如此。简而言之:您的代码将更易于测试并帮助您避免一些依赖性混乱。 (除了嘻哈之外,它绝对是向正确方向迈出的一步)。

答案 3 :(得分:0)

我个人认为静态方法首先是糟糕的设计。当然,它取决于程序本身,但允许类具有静态方法将对整个设计产生影响。我的陈述背后的一些推理:

  1. 如果静态方法可以很容易地改变某个对象的状态,那么迟早会出现错误
  2. 如果您在程序中发布静态方法,那么每个使用它的客户端都会对您的代码产生很强的依赖性。如果您决定有一天删除或更改此方法 - 您将打破使用该类的每个客户端。
  3. 所以,如果可以的话 - 避免它

    如果出于任何原因,你会坚持使用静态方法,我猜第一个解决方案更好。这就是单身人应该如何工作的。您应该通过静态方法获得对 SINGLETON OBJECT 的引用,但是此对象应该然后根据面向对象编程中的所有原则使用。