我有一些类存储带有重要信息的键。不允许其他人创建密钥,因为密钥依赖于静态信息(如某些目录结构等)。
public final class KeyConstants
{
private KeyConstants()
{
// could throw an exception to prevent instantiation
}
public static final Key<MyClass> MY_CLASS_DATA = new Key<MyClass>("someId", MyClass.class);
public static class Key<T>
{
public final String ID;
public final Class<T> CLAZZ;
private Key(String id, Class<T> clazz)
{
this.ID = id;
this.CLAZZ = clazz;
}
}
}
这个例子很简单。
我想测试错误键的后果(异常处理等)并通过 JUnit 测试用例中的反射实例化该类。
Constructor<?> c = KeyConstants.Key.class.getDeclaredConstructor(String.class, Class.class);
c.setAccessible(true);
@SuppressWarnings ("unchecked")
KeyConstants.Key<MyClass> r = (KeyConstants.Key<MyClass>) c.newInstance("wrongId", MyClass.class);
然后我问自己如何防止键类的进一步实例化(即防止通过反射进一步创建对象)?
enums
我想到了,但它们不适用于泛型。
public enum Key<T>
{
//... Syntax error, enum declaration cannot have type parameters
}
那么如何保留一组n
泛型类的实例并防止进一步实例化呢?