【问题标题】:When to use a non-instantiable class instead of an enum?何时使用不可实例化的类而不是枚举?
【发布时间】:2016-07-28 15:05:58
【问题描述】:

我碰巧看到了 java.util.Collections 类。无法实例化此类。我猜这是由于私有构造函数的存在。

然后可以以这种方式创建实例-

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

首先,Java API 创建者为什么不阻止这种行为?

这让我想到什么时候我真的应该更喜欢 non-instantiable 类而不是 enum

【问题讨论】:

  • 这是两个完全不同的问题。第一个问题的答案是 Java 的反射可以让你打破一些 Java 的规则。这是设计使然。如果你通过反思打破了规则,那么你就会被你所打破的东西咬伤。第二个问题是基于意见的,因此是题外话。
  • Collections:从java 1.2开始;枚举:从 java 5 开始; 2 < 5
  • 也许他们应该在私有构造函数中抛出异常

标签: java enums singleton


【解决方案1】:

第二个问题的简短回答:简单地避免both

冗长的回答:实际上这两个选项都不是很好。问题是:您总是希望编写易于测试的代码。

当您进行静态调用时;或者当您直接在某个枚举实例上调用方法时,您只需创建hard 进行测试的代码。 因为,在某些时候,您可能想要mock 事物。为了模拟静态/枚举调用......你需要 Powermock/ito。而那些模拟框架会操纵你的字节码,在我看来,它们带来的麻烦远比它们做得好。

虽然使用枚举作为单例,实现接口,但有一个很好的模式,请参阅我的一些较旧的答案here

【讨论】:

  • 一个枚举不需要有任何枚举值,所以Objects.requireNonNull的语法也可以用枚举来实现。
  • 我很抱歉。感谢有人花时间回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
相关资源
最近更新 更多