通过重新赋值方法参数的变量,将值重新赋值给方法内部的实例变量



我的类有一个每隔半秒运行一次的调度方法,它检查数据以查看是否有任何设备超时。如果它们超时至少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
}
}
}

这似乎是一个很大的改进,在我看来,跟踪器对象实际上使代码更具可读性,现在我能够拥有所需的行为。感谢所有回答我问题的人。

最新更新