这是一个很好用的单身人士?

时间:2014-11-13 22:39:33

标签: java design-patterns singleton

我是一名新程序员,试图找到一些最佳实践。我正在用一种方法编写一个简单的类。它需要很长的时间并返回一个int(表示一个内存量),具体取决于long的大小。

我想要不止一个这样的内存模型,似乎每一个都应该是一个单独的Singleton。这是Singleton模式的合理使用吗?我不需要只有一个实例存在,但似乎这种类在概念上是一个单例。这是使其成为单身人士的一个很好的理由吗?或者添加私有构造函数并使方法静态是否有意义?还是我在思考整件事?代码是这样的:

public class MemoryModel implements SomeInterface {

   public int get(Long links) {

      final int result;

      if (links < 700_000) {
          result = 50_000;
      } else {
          result = 140_000;
      }

      return result;
   }
}
编辑:如果我理解每个人的答案,答案是肯定的。我不想要这个类的一个实例 - 根本没有理由实例化它。我应该让方法静态,而不必实例化。

我也从单点模式被过度使用的答案和链接中得到了解,因为它创建了一个全局实体,因此可能会有问题。只有当有充分理由要求只存在一个实例时,才应使用单身人士。

5 个答案:

答案 0 :(得分:4)

当你想要在多个地方引用同一个类而不创建该类的新对象时,可以使用单例类。

在您给出的示例中,它看起来应该在公共静态方法中,因为它与类的实例没有任何关系。

单身人士和实用班级之间存在差异,请阅读link

答案 1 :(得分:2)

你应该把它变成静态......

首先,你所在的班级不是单身人士。单例是一个类,它保证你只创建一个实例。

其次,没有理由(还)提到为什么你需要一个实例。您可能希望实例预先设置对象的状态。你在那里的对象没有状态(没有字段=没有状态),只有一个方法 - 因此它可以是静态的。

答案 2 :(得分:1)

这不是你在这里的单身人士模式。你只是在课堂上有一个方法。

可能你可以先在这里阅读,然后再尝试实施一个单身人士:

Singleton Pattern

答案 3 :(得分:1)

仅仅因为你只需要1个实例,并不意味着你应该把它变成单身。如果可以避免,请不要这样做。

您的目标是仅拨打new MemoryModel()一次。您的问题是您需要一种方法从不同的地方引用该对象。

但这样做的最佳选择是简单地传递对该对象的引用。这解决了单例的问题:它们提供的全局static引用。

static final Object singleton = new Object();
static void doStuffBad() {
    // bad.. hardcoded reference & also global state
    System.out.println(singleton);
}

static void doStuffGood(Object reference) {
    // good, this does not create any bad dependencies etc.
    System.out.println(reference);
}

public static void main(String[] args) {
    doStuffBad();
    doStuffGood(new Object());
}

在某些情况下,传递引用会变得很愚蠢。所以像String.CASE_INSENSITIVE_ORDER(a Comparator)这样的单身人士才有意义。事实上它也可能对你的情况有意义。这实际上取决于你想要实现的目标以及为什么你想要制作一个单身人士。如果你想要一个因为你需要访问不同位置的对象而你的对象层次结构太乱以至于传递引用太麻烦了,你就不应该这样做。

答案 4 :(得分:1)

它显然是一个静态功能。

Singleton它是一种创造性的模式。它不仅具有唯一的实例,还封装了创建算法。

使用单例是没有意义的,如果你使用单例重复内存使用,你有一个静态方法,一个静态变量指向堆上的实例。但是使用静态方法,堆上只有一个静态方法(在java中使用较少的堆更好)。