2016-07-28 37 views
2

我碰巧看到了java.util.Collections类。一个不能实例化这个类。我想这是由于存在一个私人Constructor何时使用不可实例化的类而不是枚举?

的实例可以则在此创建way-

Class collections = java.util.Collections.class;  
Constructor cons = collections.getDeclaredConstructor(); 
cons.setAccessible(true); 
Collections instance = (Collections) cons.newInstance(); 

首先为什么没有在Java API的创造者停止这种行为?

它使被觉得我应该何时真的喜欢一个非实例级以上的枚举

+0

这是两个完全不同的问题。第一个问题的答案是Java的反射让你打破了一些Java规则。这是设计。如果你用反射来破坏规则,期望被你打破的东西咬伤。第二个问题是以意见为基础,因此是焦点话题。 –

+0

'Collections':自java 1.2;枚举:自java 5; '2 <5' – fabian

+0

也许他们应该在该私有构造函数中抛出Exception –

回答

1

对第二个问题的简短回答:只需避免均为

冗长的答案:实际上这两个选项都不是很好。事情是:你总是想编写的代码是easy来测试。

当您正在制作静态调用;或者当您直接调用某些枚举实例的方法时,则只需创建代码即hard以进行测试。 因为,在某些时候,你可能想要模拟的东西。为了嘲弄静态/枚举调用......你需要Powermock/ito。而那些嘲笑框架操纵你的字节码,在我眼里,造成比他们擅长的更多的麻烦。

尽管使用枚举作为单例,实现接口还有一个很好的模式,但请参阅我的一些旧回答here

+1

枚举不需要任何枚举值,因此语法'Objects.requireNonNull'也可以通过枚举来实现。 –

+0

谢谢;我相应地更新了我的答案。 – GhostCat

+0

我道歉。我很欣赏有人花时间回答。 –

相关问题