Java 如何使公共void方法至少运行一次
假设我有一个类Java 如何使公共void方法至少运行一次,java,exception,methods,runtime-error,runtimeexception,Java,Exception,Methods,Runtime Error,Runtimeexception,假设我有一个类ClassA,我在程序中多次使用它的getter和setter。假设在程序结束时,我必须在我一直使用的ClassA实例中运行public void checkErrors(),如果出现错误,它将抛出异常或记录错误 如果主方法没有至少调用一次checkErrors(),是否有一种方法可以设置ClassA,从而抛出RuntimeException 例如,希望您有想象力,最好有这样一个方法:public importional void checkErrors()whereimporti
ClassA
,我在程序中多次使用它的getter和setter。假设在程序结束时,我必须在我一直使用的ClassA
实例中运行public void checkErrors()
,如果出现错误,它将抛出异常或记录错误
如果主方法没有至少调用一次checkErrors()
,是否有一种方法可以设置ClassA
,从而抛出RuntimeException
例如,希望您有想象力,最好有这样一个方法:public importional void checkErrors()
whereimportional
意味着它必须由main方法运行一次
这是一个事件驱动的编程上下文
在我的问题中,ClassA
的实例可能需要进行一些计算,然后就不再需要了(类的状态由各种内部计算和设置程序产生,在程序的其他部分使用)。因此,在程序实例生命周期结束时,我希望在继续程序之前checkErrors()
(从而停止错误传播到程序的后期)
这个
强制的
就是代表程序员停止错误,至少调用这个方法一次。没有确定的方法来保证对象的方法在构造之后被调用。但是,您可以要求先调用一个方法,再调用另一个方法;例如,此模式可用于强制实施“生命周期”
boolean errorChecked = false;
public void checkForErrors() {
// do stuff and throw exception if there's a problem
errorChecked = true;
}
public void doSomething() {
if(!errorChecked)
throw new IllegalStateException("must call checkForErrors() first");
...
}
您的请求违背了面向对象编程的原则,因为单个类应该封装特定的行为,而不必关心整个程序的流程。类本身不应该意识到,它应该发生一些事情,它应该被实例化,等等,这应该在类之外的主流中进行监视
因此,如果您非常需要这样做,您可以在
ClassA
中添加一个计数器,用于计算某项操作执行了多少次,然后在main
中检查此计数器,以确保您所谈论的是类中数据的有效性。在某些情况下,数据是有效的。因此,您需要在每次更改数据时检查数据的有效性,并保持该有效性的状态
private boolean isValid;
public void setSomeData() {
// set it
checkIfErrors();
}
public Data getSomeData() {
if (isValid) {
return someData;
} else {
throw new DataIsInvalidException();
}
}
private void checkIfErrors() {
if (isOk) {
isValid = true;
}
}
我希望在事件驱动编程中,在ClassB使用ClassA的状态之前,main方法必须检查ClassA上的errors()
那么你不应该这样设计程序。相反,您应该引入一个类ValidState
,并将该类的一个实例传递给ClassB
。并且ClassA
应该有一个方法
ValidState produceValidState() throws IllegalStateException
它将检查错误,如果没有错误,则生成有效状态
这样,主方法完全不可能将无效状态传递给ClassB。它必须要求ClassA检查错误,以获得ClassB需要工作的有效状态。虽然此范例并不真正适合您所寻求的目的,但您可以尝试类似的方法。 创建一个类监视器:
public class Monitor{
private static ArrayList<Object> checkList;
public static void addToList(Object a){ // implementation }
public static void removeFromList(Object a){ // implementation }
}
所以计时器需要做的就是每隔一段时间查看一次列表,看看其中是否有空对象。如果一个为空,则在不调用
checkErrors()
的情况下释放了某些内容,您可以抛出异常。@hovercraftfullofels Done。您可以将代码放入try块,并在代码末尾使用finally
子句来保证调用方法。初始化类的方法和使用数据的方法之间是否有明确的区别?我仍然无法确定您试图做什么。@hovercraftfullofels我想强制主方法检查错误()
在ClassA
上,在ClassB
之前,在事件驱动编程案例中使用ClassA
的状态。强制
意味着如果程序员忘记调用checkErrors()时,主方法应该抛出异常
至少一次。说单元测试应该用来代替我的建议是正确的吗?这取决于……如果您只需要验证代码的有效性,那么是的,如果您需要在正常运行时进行检查,那么否。
public class ClassA{
public ClassA(){
Monitor.addToList(this);
...
}
public void checkErrors(){
Monitor.removeFromList(this);
...
}
}