【问题标题】:Making a variable constant without using a final keyword [closed]在不使用 final 关键字的情况下使变量保持不变[关闭]
【发布时间】:2017-06-05 11:26:40
【问题描述】:

我在面试中遇到了这个问题,如何在java中使一个没有final关键字的变量成为常量

【问题讨论】:

  • 相当愚蠢的面试问题,在现实生活中并不是真正需要做这样的事情。接口中的常量是非常非常糟糕的代码气味。没有人以这种方式编程是一件好事,最好不要知道/记住这一点,不要被诱惑:)
  • @MadaraUchiha 我认为这个问题并不太宽泛——它在求职面试中足够具体,可以提供明确的答案。

标签: java


【解决方案1】:

我怀疑他们正在寻找“在接口内声明变量”的答案。根据 Java 语言规范,接口中声明的所有变量都是隐式静态和最终的:

interface Foo {
    int BAR = 100;
}
class Test {
    public static void main (String[] args) throws java.lang.Exception
    {
        System.out.println(Foo.BAR);
    }
}

【讨论】:

  • 很好的答案,但是这样的面试问题的目的是什么?检查你是否是优秀的程序员?好的程序员一开始不会在 Interaces 中创建常量。
  • @KrzysztofCichocki 我不是提出这个采访问题的人,所以我不能告诉你这个问题的目的。对我来说,这是一个合法的 Java 语言难题。
  • 好吧,还有一个同样风格的大难题:在 java 中是否有可能从未声明的方法中抛出已检查的异常?是的。但是如果你这样做,你就是一个糟糕的程序员,那么当有更多必要和重要的事情要知道时,有人知道回答这样的问题会带来什么价值?
  • @KrzysztofCichocki 面试官知道候选人知道这些难题的答案是很有价值的,因为这向他们展示了一定的学习广度。在某种程度上,这类似于用你正在学习的一门外语记住脏话:你肯定不会在对话中使用它们,但是当它们在你周围说话时识别它们是有价值的。
  • 我不认为这样的问题作为学习广度的指标有任何价值。请记住,Java 中有反射、类型擦除和用于运行时字节码生成/修改的工具。这使得这个问题无法回答。使用这些工具,您几乎可以打破 Java 语言的任何规律。这是所有此类问题的唯一答案。在java中一切皆有可能!甚至可以将 Boolean 的真实值 true/false 交换为相反的值!面试问题应该是关于良好的编程实践而不是愚蠢的事情。
【解决方案2】:

您可以强制这样一个变量有效地是最终的。例如,在流中使用它。

int a = 1;
Stream.of(1, 2, 3, 4, 5).map(e -> e + a).forEach(System.out::println);

a = 12; // this line leads to a compile error

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 2019-06-13
    相关资源
    最近更新 更多