如何具有必须至少运行一次的公共void方法



假设我有一个类ClassA,我在程序中多次使用它的getter和setter。假设在程序结束时,我在一直使用的ClassA实例中运行public void checkErrors()是至关重要的,如果出现错误,它将引发异常或记录错误。

有没有一种方法可以设置ClassA,如果主方法至少没有调用checkErrors()一次,它就会抛出RuntimeException

例如,希望你有想象力,最好有一个像public compulsory void checkErrors()这样的方法,其中compulsory意味着它必须由main方法运行一次。

这是一个事件驱动的编程上下文。

在我的问题中,ClassA的实例可能需要进行一些计算,然后就不再需要了(类的状态,由各种内部计算和setter产生,在程序的其他部分中使用)。因此,在程序中实例生命周期结束时,我希望在继续程序之前checkErrors()(从而停止错误传播到程序的后期)。

这个compulsory只是代表程序员停止错误,至少调用一次这个方法。

在事件驱动的编程案例中,在ClassB使用ClassA的状态之前,我想强制主方法在ClassA上检查Errors()。

那么你不应该这样设计程序。相反,您应该引入一个类ValidState,并将该类的一个实例传递给ClassB。而ClassA应该有一个方法

ValidState produceValidState() throws IllegalStateException

它将检查错误,如果没有,则产生有效状态。

这样,主方法就完全不可能将无效状态传递给ClassB。它必须要求ClassA检查错误,以便获得ClassB需要工作的有效状态。

您的请求违背了面向对象编程的原则,因为单个类应该封装特定的行为,而不必关心整个程序的流。类本身不应该意识到,它应该发生一些事情,它应该被实例化,等等,这应该在类之外的主流中进行监控。

因此,如果你非常需要这样做,你可以在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;
}
}

没有特定的方法可以保证对象的方法在构造后被调用。但是,您可以要求在调用另一个方法之前先调用一个方法;例如,这种模式可以用于强制执行"生命周期"。

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");
...
}

虽然这种范式并不真正适合您所寻求的目的,但您可以尝试这样的方法。创建类监视器:

public class Monitor{
private static ArrayList<Object> checkList;
public static void addToList(Object a){ // implementation }
public static void removeFromList(Object a){ // implementation }
}

这个类可以有一个定时器线程,每隔一段时间就会检查它的内容。然后你可以直接构建到你需要检查的类中:

public class ClassA{
public ClassA(){
Monitor.addToList(this);
...
}
public void checkErrors(){
Monitor.removeFromList(this);
...
}
}

因此,计时器所需要做的就是每隔一段时间查看列表,看看其中是否有任何对象为空。如果其中一个为null,则在不调用checkErrors()的情况下释放了某个内容,您可以抛出异常。

最新更新