我的类有一个每隔半秒运行一次的调度方法,它检查数据以查看是否有任何设备超时。如果它们超时至少5秒,我会向数据库中抛出一个事件(这是通过checkSpecs
方法完成的,我在这里没有复制。实际的类相当大,所以我试图在保留相关部分的同时缩小大小(。
现在,我正在向类添加一个新方法checkReconnections
,每当恢复以前超时的连接时,我想用它向数据库抛出另一个事件。
因为我的类太大了,而且我正在用这个方法监视几个设备,所以我尝试创建一个助手方法monitorConnectionStatus
,它接受两个布尔值作为参数。我的问题是关于这个方法。
我的印象是,当方法被调用时,通过将实例变量传递到monitorConnectionStatus
中,该方法可以访问它们,并可以重新分配这些变量。这是我的意图,以便该方法按预期运行。但我的IDE告诉我,disconnectionStatus
的值总是错误的,这让我想,我相信实例变量会被重新分配是错的吗?在这种情况下,我的IDE可能是错误的吗?
当我重新分配disconnectionStatus
的值时,它是重新分配实例变量hasADisconnected
的值,还是只是使用局部参数变量?
Public Class OffSpecAgent {
private final DataModel dataModel;
private int deviceATimeoutCounter = 0;
private boolean isDeviceATimeout = false;
private boolean hasADisconnected = false;
private int deviceBTimeoutCounter = 0;
private boolean isDeviceBTimeout = false;
private boolean hasBDisconnected = false;
@Scheduled(fixedDelay = 500)
public void offSpecMonitor() {
checkTimeouts();
checkReconnections();
checkSpecs();
}
private void checkTimeouts() {
deviceATimeoutCounter = dataModel.getBoolean(DEVICE_A_TIMEOUT) ? deviceATimeoutCounter + 1 : 0;
isDeviceATimeout = deviceATimeoutCounter >= 10;
deviceBTimeoutCounter = dataModel.getBoolean(DEVICE_B_TIMEOUT) ? deviceBTimeoutCounter + 1 : 0;
isDeviceBTimeout = deviceATimeoutCounter >= 10;
}
private void checkReconnections() {
monitorConnectionStatus(isDeviceATimeout, hasADisconnected);
monitorConnectionStatus(isDeviceBTimeout, hasBDisconnected);
}
private void monitorConnectionStatus(boolean timeoutCondition, boolean disconnectionStatus) {
if (timeoutCondition) {
disconnectionStatus = true;
}
if (disconnectionStatus && !timeoutCondition) {
disconnectionStatus = false;
//throw reconnection event
}
}
}
在java中,变量按值传递到方法中,这意味着方法monitorConnectionStatus
只知道它正在获取false, false
值。您必须更新方法才能直接访问实例变量。
private void monitorConnectionStatus() {
if (this.timeoutCondition) {
this.disconnectionStatus = true;
}
if (this.disconnectionStatus && !this.timeoutCondition) {
this.disconnectionStatus = false;
//throw reconnection event
}
}
请注意,关键字this
不是必需的。
此外,我只想补充一点,您使用术语class variable
不正确。您所指的变量是instance variables
。
你可以在这里阅读更多信息:
https://www.tutorialspoint.com/What-are-class-variables-instance-variables-and-local-variables-in-Java
我重构了这个类,现在它看起来像这样:
Public Class OffSpecAgent {
private final DataModel dataModel;
private static class ConnectionTracker {
boolean timeout, timeoutExceeded, hasDisconnected;
int timeoutCounter = 0;
}
private final ConnectionTracker deviceATracker = new ConnectionTracker();
private final ConnectionTracker deviceBTracker = new ConnectionTracker();
@Scheduled(fixedDelay = 500)
public void offSpecMonitor() {
checkTimeouts();
checkReconnections();
checkSpecs();
}
private void checkTimeouts() {
trackTimeout(plcTracker, dataModel.getBoolean(DEVICE_A_TIMEOUT), 10);
trackTimeout(plcTracker, dataModel.getBoolean(DEVICE_B_TIMEOUT), 20);
}
private void trackTimeout(ConnectionTracker tracker, boolean isTimeout, int maxTimeout){
tracker.timeout = isTimeout;
tracker.timeoutCounter = isTimeout ? tracker.timeoutCounter + 1 : 0;
tracker.timeoutExceeded = tracker.timeoutCounter >= maxTimeout;
}
private void checkReconnections() {
monitorConnectionStatus(deviceATracker);
monitorConnectionStatus(deviceBTracker);
}
private void monitorConnectionStatus(ConnectionTracker tracker) {
if (tracker.timeoutExceeded) {
tracker.hasDisconnected = true;
}
if (tracker.hasDisconnected && !tracker.timeout) {
tracker.hasDisconnected = false;
//throw reconnection event
}
}
}
这似乎是一个很大的改进,在我看来,跟踪器对象实际上使代码更具可读性,现在我能够拥有所需的行为。感谢所有回答我问题的人。