我正在开发一个项目,在这个项目中,为了解决版本问题,我创建了许多永远不会被测试的类,并且绝对不能使用它们 - 它们只需要在那里保持编译器的快乐。我想确保它们永远不会被使用。今天早上我想到了在静态初始化块中抛出一个异常:
public class Dummy {
static {
throw new IllegalStateException("Do not use this class!");
}
}
但是编译器不喜欢它。你能想出办法吗?
编辑:要清楚(我的错我以前不清楚),这些不仅仅是空类。这里会有各种各样的代码,并且通过“让编译器保持高兴”我确实意味着在其他地方我将实例化它们,调用方法等等。我希望这些代码在别处编译但在运行时失败。我接受了Jon的回答,但也将使用@Deprecated
并在适当时进行广泛记录。
答案 0 :(得分:10)
注释@Deprecated的程序元素是程序员不鼓励使用的程序元素,通常是因为它很危险,或者因为存在更好的替代方案。当在不推荐使用的代码中使用或覆盖已弃用的程序元素时,编译器会发出警告。
答案 1 :(得分:7)
只需添加虚拟条件:
public class Dummy {
static {
if (true) {
throw new IllegalStateException("Do not use this class!");
}
}
}
我不确定我喜欢这个,但它可能会做你想要的。如果没有像这样完全无用的课程,你确定没有其他可以让你离开吗?
答案 2 :(得分:6)
为其指定private
默认构造函数,并制作class
final
。
答案 3 :(得分:3)
假设您不希望在生产代码中抛出IllegalStateExceptions,请使用断言并确保在QA / Test环境中启用它们。代码也稍微好一些:
public class Dummy {
static {
//This class should never be initialised!
assert false : "This class should never be initialised";
}
...
}
答案 4 :(得分:2)
您可以使用以下内容来解决编译器:
public class Dummy {
static {
if (true)
throw new IllegalStateException("Do not use this class!");
}
}
但那可能是作弊; - )
答案 5 :(得分:2)
如果从未引用它们,请将类设置为默认范围,因此包外的其他类型都不能看到它们。如果他们看不到他们就无法引用它们(不使用反射)。
class Dummy {
//no-op
}
答案 6 :(得分:2)
为什么不将该类放入已部署的jar中。这样它就会在编译时出现,但如果有人试图在运行时访问它,你将得到一个ClassNotFoundException。
答案 7 :(得分:1)
使用AssertionError而不是IllegalStateException
答案 8 :(得分:0)
我认为你不能这样做,虽然你可以在类声明之前放一个@deprecated标签。这样,如果你尝试使用它,编译器会给你一个警告,但它仍然会编译。
答案 9 :(得分:0)
您可以使用自己的ClassLoader并根据黑名单列表检查每个类。
答案 10 :(得分:0)
“使用”是什么意思?如果你需要在那里,它听起来像编译器需要能够创建类。但是,如果您不希望创建该类的任何实例,则在实际构造函数中创建Assertion或抛出异常。