静态成员不是自己创建类(全局)对象吗?

时间:2009-02-03 00:09:29

标签: oop class design-patterns singleton static-members

每当我遇到单例模式或任何静态类的实现(即具有(几乎)仅静态成员的类)时,我想知道这是否实际上不是一个hack,因此滥用了类和实例的原则只是设计单个对象而不是设计类和创建单个实例。对我来说,它看起来像类的静态成员一般尝试向它们实际上不应该具有的类添加某种特性,而是让它们自己对象。

但是,实现这样的单个对象真的很可取吗? 或者你是否完全不同地看待事物,并且不认为这些静态类或单例与实际对象有任何共同之处?

5 个答案:

答案 0 :(得分:7)

静态成员实际上只是全局变量的命名空间,是的。没有错;命名空间很好,全局变量是完成某些任务的最简洁方法。

单身人士可能会更有趣(按需加载......)但它们是一个类似的结构(是的,你可以把静态成员看作是由编译器管理的匿名单身人士)。

与大多数事情一样,这些工具占有一席之地,只有理论家才会担心他们是否“适应”特定的意识形态。

答案 1 :(得分:2)

根据您的语言,类是对象。在ruby和java中,它们属于Class类;在python中,我不记得了(类型的子类?)。

在java中,你无法避免把东西放在课堂上。这意味着您有时必须使用类似于使用命名空间和模块的类。 Math上的许多静态方法就是一个很好的例子。我会说让这些方法保持静态会使情况变得最糟糕。

我认为拥有静态属性是否“脏”在很大程度上取决于上下文。你真正应该寻找的是适当的封装:如果你能在代码的概念空间中绘制一条曲线并说“这方面的所有东西都不需要知道任何关于那边的事情,除了跨越界面,这是很好的。曲线。

答案 2 :(得分:2)

您可以从性能和内存的角度查看它。例如,在以下代码中:

public class StringUtils
{
    public static boolean isEmpty(String value)
    {
        // some code
    }

    public static String reverseString(String value)
    {
        // some code
    }
}

你真的想要在整个地方实例化StringUtils对象只是为了调用一个不存储任何成员变量的方法吗?在一个简单的程序中,它并不重要。但是一旦你的程序开始达到一定的大小并且你将这些方法称为数千次,那么就让实例化可以加起来。为什么?成为纯粹主义者?这不值得花钱。只需使用相同的实例。

答案 3 :(得分:1)

假设我有一个具有单个配置文件的应用程序。如果我的语言不支持类之外的全局函数(如Java或C#),如何在不使用“单例”的情况下创建函数来操作该文件?

在我看来,实现这一目标的唯一真正方法是拥有单例类。使用单例模式,您也不需要传递指向对象的指针,因为您可以使用静态方法再次获取它。

我不知道这是如何违反任何OO原则的。要以不同的方式执行此操作,例如将配置函数放在另一个不处理配置的类中(如“实用程序”类),则更多违反OO原则。

答案 4 :(得分:0)

假设您有一个需要中央数据存储库的多线程应用程序。消费者和生产者在存储库中使用或放置数据,包括通过接口访问存储库的外部应用程序对象。

如果您将此存储库设置为普通类对象,则会遇到初始化它并获取指向需要它的每个对象的指针的问题。这不是最棘手的问题,但它可能会让很多线程和对象感到困惑。

另一方面,如果你这样做:

public enum Data implements MyInterface{
   INSTANCE;
       private final Whatevertype secretstuff = new Whatevertype();
       ...etc...
       public void PutThing( Sometype indata){ ... };
       public Sometype GetThing( int somecode ){ ...};
       ...etc...
 }

您(a)不必实例化任何内容,(b)可以从任何地方访问

Data.INSTANCE.GetThing(42);

等。它就像Highlander ......只能是一个