假设我有一个类ClassA
,我的程序中多次使用其getter和setter。假设在程序结束时,我必须在public void checkErrors()
的实例中运行ClassA
,这将导致异常或在出现错误时记录错误
我是否可以设置ClassA
如果主要方法至少没有调用RuntimeException
,则会checkErrors()
抛出一个public compulsory void checkErrors()
?
例如,希望你有想象力,最好有一个方法:compulsory
其中ClassA
表示必须一次由主要运行方法
这是一个事件驱动的编程上下文。
在我的问题中,可能需要checkErrors()
的实例进行一些计算,然后不再需要(具有类的状态,由各种内部计算和设置器产生,用于其他部分程序)。因此,在实例的程序结束时,我希望在继续程序之前compulsory
(从而阻止错误传播到程序的后期阶段)。
这{{1}}这个问题只是代表程序员停止错误,至少调用一次这个方法。
答案 0 :(得分:3)
您所要求的内容违反了面向对象编程的原则,因为单个类应该封装特定的行为,而不必关心整个程序的流程。该类本身不应该意识,应该发生一些事情,它应该已经实例化,等等,这应该在类的主流之外进行监控。
因此,如果您需要执行此操作,则可以向ClassA
添加一个计数器,计算某些事件的次数,然后在main
中检查此计数器。
答案 1 :(得分:3)
我希望在ClassB在事件驱动的编程案例中使用ClassA的状态之前,让mainA方法必须在ClassA上checkErrors()。
然后你不应该这样设计程序。相反,您应该引入一个类ValidState
并将此类的实例传递给ClassB
。 ClassA
应该有一个方法
ValidState produceValidState() throws IllegalStateException
将检查错误,如果没有,则生成有效状态。
这样,main方法完全无法将无效状态传递给ClassB。它必须要求ClassA检查错误,以便获得ClassB需要工作的有效状态。
答案 2 :(得分:2)
当然,您所说的是您班级数据的有效性。在某些时候数据是有效的。因此,您需要在每次更改数据时检查数据的有效性,并保持此有效性的状态。
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;
}
}
答案 3 :(得分:1)
没有必要保证对象的方法在构造之后被调用。但是,您可以要求在另一个方法之前调用方法;例如,此模式可用于强制执行“生命周期”。
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");
...
}
答案 4 :(得分:0)
虽然这种范式并不适合您所寻求的目的,但您可以尝试这样的事情。 创建一个类Monitor:
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()
的情况下释放某些内容,并且您可以抛出异常。