Java:if 语句 returns 的样式问题?

Java: Style issue for if statement returns?

假设我有一个方法要求我遍历一个数据结构,然后 return 一个存储在特定索引中的数字,如果它等于给定的数字。如果数据结构中的两个数字相等,那么它将 return 先出现的数字。

public static int method(int value, List<Integer> list){
    for (Integer i: list){
        if (i == value){
            return i;
        }
    }
}

这是一个有问题的解决方案,因为方法不一定return。我想您可以创建一个变量来存储对等效值和 return 的引用,这样编译器就不会发出有关缺少 return 语句的错误,但那将是毫无意义的代码。

有更好的方法吗?如果您正在 return 一个对象,您是 return 0 还是 return null?

我假设这是一个理论问题,否则你真的只是 return true(它在列表中)或 false(它不在列表中) ).您已经知道要搜索的号码,因此找到它并 returning 它不会为调用代码增加任何价值。事实上,对于这种情况,您只需使用 public boolean contains(O o) from Lists implementation of Collection 并避免编写自己的方法。

public static boolean method(int value, List<Integer> list) {
    for (Integer i: list)
        if (i == value) return true;
    return false;
}

所以考虑到这个学术问题,为什么不 return 你想要的列表中数字的 index 和 return -1 如果列表中没有匹配您想要的号码。

 public static int method(int value, List<Integer> list) {
    for (int j = 0; j < list.size(); j++) {
        Integer i = list.get(j);
        if (i == value){
            return j;
        }
    }
    return -1;
}

这样你就不必定义 "special case" return 值,自动装箱到 return null,或定义一个新的结构来同时携带数字和一个 "success" 标志。

如果找不到正常的值,return-1表示"not found",因为正常的return是一个数组索引。

但是,如果运行循环完成确实是异常和意外的,那么就抛出异常,不要return一个神奇的值。

 public static int method(int value, List<Integer> list){
    for (int j = 0; j < list.size(); j++) {
        Integer i = list.get(j);
        if (i == value){
            return j;
        }
    }
    throw new IllegalStateException("The method 'SomeClass.method' reach an invalid termination point");
}

看看 Collection.contains()List.indexOf()。他们处理这两种情况的方式对于 Java 来说非常惯用,Java 开发人员会立即熟悉。