我经常发现自己在类中使用数组,并且需要跟踪数组中当前正在使用的值。例如,想象一个具有一系列相机的相机系统,我需要跟踪哪一个当前处于活动状态。我一直这样做的方法是创建数组和一个名为cameraIndex 的int 变量或类似的变量。然后,当我切换数组值时,我会更改cameraIndex的值。这确实有效,但我总觉得可能有更好的方法来做到这一点。似乎没有必要创建额外的变量来跟踪。
这是一个简单的例子:
class Camera{
// Pretend there's camera logic in here.
}
class User{
public setCamera(Camera newCamera){
// Logic for having the user look through a new camera.
}
}
class CameraSystem{
private User user;
private Camera[] cameraList;
private int cameraIndex = 0;
public void goToNextCamera(){
cameraIndex++;
user.setCamera(cameraList[cameraIndex]);
}
}
您的方法是正确的,有一种方法可以管理当前活动相机,而无需使用附加变量(例如
i
)显式跟踪其索引。一种方法是直接将当前活动相机的引用存储在 CameraSystem
类中。
class CameraSystem {
private User user;
private Camera[] cameraList;
private Camera activeCamera; // Store the reference (not index) of the camera
public CameraSystem(User user, Camera[] cameraList) {
this.user = user;
this.cameraList = cameraList;
this.activeCamera = cameraList[0];
// basic setup
}
public void goToNextCamera() {
int nextIndex = (getIndex(activeCamera) + 1) % cameraList.length; // This is where you can store the next camera in its new index.
activeCamera = cameraList[nextIndex];
user.setCamera(activeCamera);
}
private int getIndex(Camera camera) {
for (int i = 0; i < cameraList.length; i++) {
if (cameraList[i] == camera) {
return i;
}
}
return -1; // If camera isn't there
}
}
这里,在
CameraSystem
类中,它直接存储对活动相机(activeCamera
)的引用。当您想要切换到下一个摄像机时,您可以迭代 cameraList
数组以查找当前活动摄像机的索引,然后移动到下一个索引(当到达数组末尾时进行循环迭代)。最后,您更新 activeCamera
参考并为用户进行设置。这种方法避免了对像 cameraIndex
这样的额外变量的需要。