代码之家  ›  专栏  ›  技术社区  ›  Tobias

在Java中,在构造函数之前初始化最终变量

  •  7
  • Tobias  · 技术社区  · 17 年前

    有没有在Java构造函数中使用最终变量的解决方案? 问题是,如果我初始化一个最终字段,如:

    private final String name = "a name";
    

    9 回复  |  直到 14 年前
        1
  •  17
  •   Johannes Weiss    17 年前

    我不太明白你的问题。那个

    public class Test3 {
        private final String test = "test123";
    
        public Test3() {
            System.out.println("Test = "+test);
        }
    
        public static void main(String[] args) {
            Test3 t = new Test3();
        }
    }
    

    执行如下:

    $ javac Test3.java && java Test3
    Test = test123
    
        2
  •  15
  •   Hank Gay    17 年前

    private final String name;
    private YourObj() {
        name = "a name";
    }
    

    当然,如果您在变量声明时确实知道该值,则将其设置为常量更为合理,例如。,

    private static final String NAME = "a name";
    
        3
  •  5
  •   Eun    11 年前

    我们正在回避这个问题。

    是的,你可以使用 private final

    public class Account {
        private final String accountNumber;
        private final String routingNumber;
    
        public Account(String accountNumber, String routingNumber) {
            this.accountNumber = accountNumber;
            this.routingNumber = routingNumber;
        }
    }
    

    这意味着Account类依赖于Account和routing Number这两个字符串。在构造Account类时,必须设置这些类属性的值,并且在不创建新类的情况下不能更改这些值。

        4
  •  3
  •   sfossen    17 年前

    将其标记为静态将允许您在构造函数中使用它,但由于您将其设置为最终,因此无法更改。

    private static final String name = "a_name";
    

    也可以使用静态init块。

    private static final String name;
    
    static { name = "a_name"; }
    

    private String name = "a_name";
    Foo( String name )
    {
        this.name = name;
    }
    

    private final String name;
    
    Foo( String name )
    {
        if( s == null )
           this.name = "a_name";
        else
           this.name = name;
    }
    
        5
  •  2
  •   Tim Frey    17 年前

    在这种情况下,还可以将字段标记为“static”。

        6
  •  2
  •   Joachim Sauer    17 年前

    另一种可能性是初始化实例初始值设定项块中的字段:

    public class Foo {
            final String bar;
    
            {
                    System.out.println("initializing bar");
                    bar = "created at " + System.currentTimeMillis();
            }
    
            public Foo() {
                    System.out.println("in constructor. bar=" + bar);
    
            }
    
            public static void main(String[] args) {
                    new Foo();
            }
    }
    
        7
  •  1
  •   Adam Jaskiewicz    17 年前

        8
  •  1
  •   daanish.rumani    17 年前
    private static final String name = getName();
    

    哪里 getName() 是一个获取名称的静态函数。

        9
  •  0
  •   soulmerge    17 年前

    我不能在构造函数中使用它,而java首先运行构造函数,然后运行字段。。。

    这是不正确的,首先计算字段,否则您无法访问构造函数中成员的任何默认值,因为它们不会被初始化。这

    public class A {
        protected int member = 1;
        public A() {
            System.out.println(member);
        }
    }
    

    关键词 最终的 仅将成员标记为常量,否则将其视为任何其他成员。

    设置