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()
where
importional
意味着它必须由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);
        ...
    }

}