从 void 和 boolean 方法返回多个值

Posted

技术标签:

【中文标题】从 void 和 boolean 方法返回多个值【英文标题】:Return multiple values from void and boolean methods 【发布时间】:2016-02-12 06:00:10 【问题描述】:

我有以下问题:有一个计算两个整数之间相似度的布尔静态方法,我被要求返回 4 个结果:

    不改变方法的返回类型,它 应该保持布尔值。 不更新/使用外部变量和对象的值

这是我到目前为止所做的(我不能将返回值从布尔值更改为其他值,例如 int,我只能使用布尔值):

public static boolean isSimilar(int a, int b) 
    int abs=Math.abs(a-b);
    if (abs==0) 
    return true;
     else if (abs>10) 
    return false;
     else if (abs<=5)
        //MUST return something else, ie. semi-true
     else 
        //MUST return something else, ie. semi-false
    

【问题讨论】:

抛出一个包含返回值的异常,或者改变一个参数,比如int[],除非它违反了约束2。 布尔值要么是真要么是假,所以你只有这两个选项。要返回这两个选项以外的任何内容,您需要将返回数据类型更改为其他内容。故事结束 谁问你这个的?对我来说,这似乎是一个棘手的问题,提出问题的人有一个解决方案,可以扩展他们在问题中使用的术语的定义。 今天早上在面试(实习)。信不信由你,剩下的问题都是小菜一碟,一些智商,一些Java基础知识。我想这件事有所作为,让我们现在等待结果 Gaaaack。我希望这不是一个面试问题。我真的质疑任何人的能力,他们认为像这样的面试问题会揭示谁更适合某个职位或实习。除非他们打算给那些说“那将是一种非常糟糕的编程方式”的受访者打分。但也许其他人可以向我解释这类问题的价值? 【参考方案1】:

无论如何,以下是不好的做法,但是如果您可以尝试捕获异常,您实际上可以按照约定定义一些额外的输出。例如:

public static boolean isSimilar(int a, int b) 
    int abs = Math.abs(a-b);
    if (abs == 0) 
        return true;
     else if (abs > 10) 
        return false;
     else if (abs <= 5)
        int c = a/0; //ArithmeticException: / by zero (your semi-true)
        return true; 
     else 
        Integer d = null;
        d.intValue(); //NullPointer Exception (your semi-false)
        return false;
    

【讨论】:

据我后来听到的,这是面试中接受的答案之一 哦,哇,那我强烈建议离开这家公司(或寻找另一家),当这样一个糟糕的设计被认为是面试中的答案时。【参考方案2】:

一个布尔值可以有两个值(真或假)。时期。因此,如果您无法更改返回类型或外部的任何变量(无论如何这都是不好的做法),就不可能做您想做的事。

【讨论】:

除了抛出一个 RuntimeException,它会起作用,但是是一个真的糟糕的设计决策:-)【参考方案3】:

向函数添加参数是否违反规则 2?如果没有,这可能是一个可能的解决方案:

public static boolean isSimilar(int a, int b, int condition) 
    int abs = Math.abs(a - b);
    switch (condition) 
    case 1:
        if (abs == 0) 
            return true; // true
        
    case 2:
        if (abs > 10) 
            return true; // false
        
    case 3:
        if (abs <= 5 && abs != 0) 
            return true; // semi-true
        
    case 4:
        if (abs > 5 && abs <= 10) 
            return true; // semi-false
        
    default:
        return false;
    

通过调用函数 4 次(使用条件 = 1、2、3 和 4),我们可以检查 4 个结果(只有一个会返回 true,其他 3 个会返回 false)。

【讨论】:

尚不清楚它是否违反规则,它可能确实,它在边界线上,但我想这个解决方案也可以接受。

以上是关于从 void 和 boolean 方法返回多个值的主要内容,如果未能解决你的问题,请参考以下文章

java中方法的返回类型都有哪些?可以引用数据类型吗?举例说明

如何以较少的费用从 java 中的方法返回两个值(1.Collection,2.Single Boolean 值)?

最好返回 NSArray 还是 void 并更新 self 属性?

方法返回指令

为啥 List.add(E) 返回 boolean 而 List.Add(int, E) 返回 void?

反应堆映射 Mono<Boolean> 到 Mono<Void>