[英]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.