这是代码:
package com.XXX;
public final class Foo {
private Foo() {
// intentionally empty
}
public static int bar() {
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
这是测试:
package com.XXX;
public FooTest {
@Test
void testValidatesThatBarWorks() {
int result = Foo.bar();
assertEquals(1, result);
}
@Test(expected = java.lang.IllegalAccessException.class)
void testValidatesThatClassFooIsNotInstantiable() {
Class cls = Class.forName("com.XXX.Foo");
cls.newInstance(); // exception here
}
}
Run Code Online (Sandbox Code Playgroud)
工作正常,课程经过测试.但Cobertura表示,该类私有构造函数的代码覆盖率为零.我们如何为这样的私有构造函数添加测试覆盖率?
一些实用程序类(think java.lang.Math)只声明一个私有构造函数,以防止实例化该类.
有没有什么特别的理由说明为什么这些类没有用0实例枚举实现?在我看来,enums是一种比构造函数上的访问修饰符更直接的控制实例化的方法.它还可以防止类本身创建实例,这些实例既可以防止程序员在脚中射击,也可以向外传递任何实例的保证.
约书亚布洛赫主张使用枚举作为单身人士.0-instance实用程序类不应该具有相同的优点吗?
我的问题: 0实例枚举与私有构造函数的优缺点是什么?(我个人认为使用枚举没有任何缺点,尽管私有构造函数似乎是更普遍的方法.)
(我知道java.lang.Math早些时候enum.我在这里说1.5+代码.)