繁体   English   中英

所有静态方法还是单个实例?

[英]All static methods or a single instance?

有时候,由于集合的缘故,我想到了一个类的单个实例就足够了的情况。 我的Decoder类就是一个例子:

public class Decoder
{

    private static final Decoder instance = new Decoder();
    private final HashMap<Client, State> states = new HashMap<Client, State>();

    private Decoder()
    {

    }

    public Packet decode(Client client, ByteBuffer data)
    {
            return null;
    }
}

但是我在想,为什么不做它,使它看起来像这样:

public class Decoder
{

    private static final HashMap<Client, State> states = new HashMap<Client, State>();

    public static Packet decode(Client client, ByteBuffer data)
    {
            return null;
    }
}

两种设计都有效地完成了同一件事。 两者有什么实际区别? 我什么时候可以使用另一个? 谢谢。

如果要对使用Decoder (或任何其他“实用程序”对象)的类进行单元测试,则可能需要对其进行模拟-即,将Decoder替换为已知行为的伪对象。 这样,如果Decoder类发生更改,则单元测试不会中断。

如果Decoder是一个实际的对象,这将更容易实现。 如果Decoder是一个充满静态方法的类,那么您就很难真正对其进行模拟(尽管有些模拟框架可以通过处理字节码来实现此目的)。

简而言之,静态方法是可测试性的反模式。 我强烈建议您不惜一切代价避免使用它们。 如果您想了解更多有关此方面的信息,请尝试http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/-该网站上还有许多其他有关可测试性的好建议太。

我认为在客户端类中编写代码时,使用静态方法会更短一些,

public class Collections {
   // Suppresses default constructor, ensuring non-instantiability.
   private Collections() {
   }

   public static <T extends Comparable<? super T>> void sort(List<T> list) {
       ...
   }
}

那我们有

Collections.sort(list);

我将使用所有静态方法,除非您看到需要实现接口的需求,例如可以模拟或替换实例。

public enum Decoder implements IDecoder {
    INSTANCE;

    private final Map<Client, State> states = new HashMap<Client, State>();

    public Packet decode(Client client, ByteBuffer data) {
            return null;
    }
}

要么

public enum Decoder {;
    private static final Map<Client, State> states = new HashMap<Client, State>();

    public static Packet decode(Client client, ByteBuffer data) {
            return null;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM