在Java中,我如何确保永远不使用虚拟类?

时间:2009-07-20 12:13:25

标签: java

我正在开发一个项目,在这个项目中,为了解决版本问题,我创建了许多永远不会被测试的类,并且绝对不能使用它们 - 它们只需要在那里保持编译器的快乐。我想确保它们永远不会被使用。今天早上我想到了在静态初始化块中抛出一个异常:

public class Dummy {

    static {
        throw new IllegalStateException("Do not use this class!");
    }
}

但是编译器不喜欢它。你能想出办法吗?

编辑:要清楚(我的错我以前不清楚),这些不仅仅是空类。这里会有各种各样的代码,并且通过“让编译器保持高兴”我确实意味着在其他地方我将实例化它们,调用方法等等。我希望这些代码在别处编译但在运行时失败。我接受了Jon的回答,但也将使用@Deprecated并在适当时进行广泛记录。

11 个答案:

答案 0 :(得分:10)

@Deprecated

  

注释@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或抛出异常。