我经常发现自己在类中使用数组,并且需要跟踪数组中当前正在使用的值.例如,想象一个具有一系列摄像机的摄像机系统,我需要跟踪哪个摄像机当前处于活动状态.我一直这样做的方法是创建数组和一个名为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等额外变量的需要.

Java相关问答推荐

无法找到符号错误—Java—封装

如何在访问完所有文件后加入所有线程?

Java List with all combinations of 8 booleans

无法在WebSocket onMessage中捕获错误

我需要生成一个文件来整合每个特性执行的所有JSON结果

在springboot 3中,当我调用api endpoint时,会出现404

如何使用SpringBoot中的可分页对整数作为字符串存储在数据库中时进行排序

为什么Java编译器不区分不同类型的方法?

如何获取Instant#of EpochSecond(?)的最大值

类型集合的Jackson JsonNode:类型引用的对象读取器应该是Singleton吗?

将JSON字符串转换为Java类

通过Java列表中的某些字段搜索值

找出承载Cargo 的最小成本

Java 21中泛型的不兼容更改

在应用getCellFormula()时,Excel引用中的文件名始终为";[1]";使用Apache POI()

获取所有可以处理Invent.ACTION_MEDIA_BUTTON Android 13 API33的Android包

将基于实例编号的对象列表拆分为新的对象列表

为什么Spring要更改Java版本配置以及如何正确设置?

Android上的SQLite:Android.database.SQLite.SQLiteReadOnlyDatabaseException:try 写入只读数据库(代码1032 SQLite_readonly_DBMOVED)

错误:JOIN/ON的参数必须是boolean类型,而不是bigint类型.Java Spring启动应用程序