【问题标题】:Initializing a final variable in java by calling a method通过调用方法在java中初始化最终变量
【发布时间】:2016-10-02 17:11:34
【问题描述】:

以下是初始化最终变量的代码。

class MyClass{

    public final int x = newMethod1();

    public int newMethod1(){
        return 10;
    }

}

上面的代码符合并运行良好。 我的问题是,当我们将变量声明为 final 时,我们需要在同一行中使用常量值对其进行初始化。现在该方法将被动态调用,简而言之,变量没有以常规方式初始化,或者是吗?为什么我们没有在这里抛出编译错误?

【问题讨论】:

    标签: java final


    【解决方案1】:

    当我们将一个变量声明为 final 时,我们需要在同一行中用一个常量值初始化它

    不,你没有。初始化后您无法重新分配它。你甚至不需要在它的声明行初始化它。

    【讨论】:

      【解决方案2】:

      声明一个变量final只是意味着对象只能被初始化一次,与何时无关。当您想确保某人不会错误地覆盖它的值时,这特别有用。此外,它有助于编译器在某些情况下表现得更好,this answer 可能会让您感兴趣。为了描述我所说的,这是使用 final 关键字的一种完全有效的方式。

      final String var;
      if(condition){
          var = "some value";
      } else{
          var = "some other value";
      }
      

      【讨论】:

        【解决方案3】:

        当我们将一个变量声明为 final 时,我们需要在 具有恒定值的同一行

        一个反例是:

        public class QuickTest {
        
            private final int x;
            {
                x = 5;
            }
        
            private final static int y;
            static {
                y = 5;
            }
        
            public QuickTest() {
            }
        }
        

        当我想用多行代码设置final 字段时(即不仅仅是一个方法调用),我有时会这样做。如果我愿意,这些{} 外壳也让我有机会将所有内容包装在适当的try-catch 中。请记住,在您的示例中 - 如果#newMethod1() 抛出错误,那么您的类将无法实例化。只是一个例子来说明:

        public class QuickTest {
        
            private final int x;
            {
                try {
                    int someCalculation = 5 + 3;
                    someCalculation += 10;
        
                    // set it
                    x = someCalculation;
                } catch (Exception e) {
                    // handle exception if we can
                    ;
        
                    // unrecoverable error, so let the calling code fail :(
                    // LogManager.error(this, e);
                    throw new RuntimeException(e);
                }
            }
        
            public QuickTest() {
            }
        }
        

        finalHERE 上的 Java 规范链接

        【讨论】:

          【解决方案4】:

          在java中,如果你在premitive变量之前使用final,这意味着一旦它被分配,它就不能被重新分配。

          例如。最终int a = 5;

          第二点,如果你在引用类型之前使用final,那么它所分配的对象是不能改变的。

          例如。 final Animal 动物=new Dog();

          animal = new Cow();// you cant do it
          animal.color="white";// you can do it
          

          在您的情况下,您只分配一次最终变量。所以编译器没有给出任何错误。

          【讨论】:

            【解决方案5】:

            最终变量是常量,并且值不能重新分配给它。我们可以将最终变量声明为类标签,也可以将其声明为方法/块标签。

            第一个是,如果将任何最终变量声明为类标签变量,那么您必须在变量声明本身的第一行对其进行初始化。因为编译器认为这个类标签变量可能会在类中的任何地方使用,如果它在声明本身时没有初始化,那么如果在任何地方使用它都会导致异常。为了更安全,编译器会强制你声明它。

            第二个是,如果您在任何方法/初始化块等中声明任何最终变量,那么您可以在不初始化的情况下声明该方法。因为变量 范围是该块的本地变量,并且有可能在其他地方无法使用。所以编译器不会强迫你初始化它。

            现在回到您的问题,调用该方法只是为了初始化最终变量。所以编译器不会为此给出错误,因为你正在做编译器想要你做的事情。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-02-15
              • 2014-06-19
              • 1970-01-01
              • 2019-07-12
              • 1970-01-01
              • 1970-01-01
              • 2020-04-14
              相关资源
              最近更新 更多