我有枚举A、B、C. 在一个方法中,我被赋予了两个不同的Enum,并且必须返回剩余的Enum.

例如:我收到A和C,我必须返回B

我的解决方案是,如果不是这样,我就使用:

private EnumABC findRemaining(EnumABC pEnum1, EnumABC pEnum2){
    if((pEnum1 == EnumABC.A || pEnum2 == EnumABC.A) 
        && (pEnum1 == EnumABC.B || pEnum2 == EnumABC.B)){
        return EnumABC.C; 
    } else
    if((pEnum1 == EnumABC.A || pEnum2 == EnumABC.A)
        && (pEnum1 == EnumABC.C || pEnum2 == EnumABC.C)){
        return EnumABC.B;
    } else{
       return EnumABC.A;
    }
}

我想知道有没有比这个更具可读性的解决方案.

推荐答案

虽然Basil的答案是最优雅的一个,但这个答案是迭代的,而且相当可读:

enum EnumABC {
  A,B,C;

  EnumABC findRemaining(EnumABC other) {
    return Arrays.stream(values())
                 .filter(v -> v!=this&&v!=other)
                 .findFirst()
                 .get();
  }
}

这现在是枚举的一种方法,所以不是

EnumABC remaining = findRemaining(pEnum1, pEnum2);

你必须用以下方式来称呼它

EnumABC remaining = pEnum1.findRemaining(pEnum2);

Java相关问答推荐

查找最大子数组的和

Java在模块化jar文件中找不到类,但是javap可以

屏蔽字母数字代码的Java正则表达式

不推荐使用的Environment.getExternalStorageDirectory().getAbsolutePath()返回的值不同于新的getExternalFilesDir(空)?

在Java中如何从Executors.newFixedThreadPool(MAX_THREAD_COUNT())迁移到虚拟线程

带错误BER验证的itext8签名返回pdf

Arrays.hashcode(int[])为不同的元素提供相同的散列

使用Room Database删除Jetpack合成中的所有项目后,UI未重新合成

搜索列表返回多个频道

使用存储在字符串变量中的路径目录打开.pdf文件

Android应用程序为错误的显示类型 Select 尺寸文件

Java中HashSet的搜索时间与TreeSet的搜索时间

为什么这种递归会有这样的行为?

从12小时开始的日期模式

我的代码是线程安全的吗?[Java、CAS、转账]

OAuth:登录后无法查看Google邮箱地址

读取ConcurrentHashMap中的可变对象

Java方法参数:括号中的类型声明?

@此处不能应用可为null的批注

在java中使用SevenZip.openArchive方法后无法删除文件