适当的单身设计?

时间:2011-06-27 20:01:27

标签: java methods static singleton

  

可能重复:
  Efficient way to implement singleton pattern in Java

我有一个单例类,可以充当我的应用程序的状态保护程序。例如,如果我有一个包含某些数据的视图,我只是将数据保存到已保存的状态可序列化对象,然后将其传递给我的单例以便稍后进行检索。这一切看似自然而恰当,但我偏离了Wiki上的单例示例。有一个get实例方法的Intead将让我检索实例并通过实例调用方法,我只是将每个方法设置为静态并静态使用该类。

这是不好的形式?表演会失败吗?

感谢任何提示~Aedon

6 个答案:

答案 0 :(得分:4)

如果静态使用满足了你的需求,我看不到任何邪恶。

唯一的缺点是它的灵活性稍差。如果将其设计为实际单例,则可以使用用于管理状态的接口,并针对特定情况实例化特定实现。然后可以将此对象作为参数传递给您的应用程序。

使用严格的静态类,没有传递对象,所以你不得不求助于传递Class对象并通过该接口访问函数。

当然,所有这一切都很重要,如果这有可能超出你当前班级的合理能力。

答案 1 :(得分:4)

是的,它被认为是不好的形式。

Java中的静态类存在许多难以使用的问题。例如,您无法实现接口。此外,如果您需要再次使其成为常规单身人士 - 或者需要使其成为非单身人士(经常发生) - 您将不得不重写与其交互的每一行代码。

答案 2 :(得分:1)

是的,仅使用静态方法和变量不是面向对象的方式。 单身人士通常被认为是一种不好的做法。但是,我承认它们有时非常有用。这是一个如何创建有效且功能强大的Singleton类的简单示例。请注意,还有其他方法,但这是最常见的...

public class Singleton {
   private static final Singleton uniqueInstance;

   public static synchronized Singleton getInstance() {
     if (Singleton.uniqueInstance == null) {
       Singleton.uniqueInstance = new Singleton();
     }
     return Singleton.uniqueInstance;
   }

   //other methods go here...

   @Override
   protected Singleton clone() throws CloneNotSupportedException() {
     throw new CloneNotSupporedException("cloning of singleton is not supported");
   }

   //hide constructor for others to see
   private Singleton() {
   }
}
欢呼,P

答案 3 :(得分:0)

Use Enum instead of Singleton。这是最安全的方式。

答案 4 :(得分:0)

它被认为是不好的形式,因为它不是面向对象的风格。许多人认为单身人士形式不佳。坦率地说,它会对你正在尝试做的事情很好。除非您打算将其提交给我进行审核或评估,否则我会不管它。

作为静态类,性能可能会更好。

答案 5 :(得分:0)

添加到@Boris'评论,如果你需要的只是一个Utility类,它使用枚举更简单

public enum Utility {
    ; // no instances
    public static Object myStaticMethod(Object ... args) { }
}

如果你有一个实现的接口,这个单例是有意义的。注意,您可以使用枚举

创建多个Singleton
public enum Callables implements Callable<String> {
    HELLO {
         public String call() { return "Hello"; }
    }, 
    WORLD {
         public String call() { return "World"; }
    }
}

注意:HELLO和WORLD共享一个超级Callables但实际上有不同的类。