2011-04-27 76 views
3

如果我设置某个类的属性的值并使用final,那么是否必须将该属性初始化为类构造函数的参数?例如,我已经长度的属性齿条设置为60个使用已在构造函数中初始化的类的属性

public class Runs { 
    Teams team; 
    final int racklength=60; 
    int xposteam; 

    public Runs (Teams y) { 
     team=y;   
    } 
} 
+0

您可以缩进代码格式代码块由4个空格(或选择代码部分并单击编辑器中的{}按钮)。我为你做了这个,但你可能想编辑这个问题,并试着修改一下格式。 – 2011-04-27 00:30:02

回答

1

你必须始终初始化final属性,但你可以做到这一点无论是在地方(你首先声明它),或在其构造函数(或构造函数):

public class Runs { 
    Teams team; 
    final int racklength; // initialization postponed 
    int xposteam; 

    // constructor defaulting racklength to 60 
    public Runs (Teams y){ 
     team=y; 
     racklength=60; 
    } 

    // constructor with variable initialization of final attribute 
    public Runs (int l, Teams y){ 
     team=y; 
     racklength=l; 
    } 

    // error since racklength is not initialized during construction 
    public Runs(){ 
     team=null 
    } 
} 
3

final字段的值必须要么初始化内嵌或构造。

实施例:

class Foo { 
    final String bar = "bar"; 
    Foo() { 
    } 
} 

class Foo { 
    final String bar; 
    Foo() { 
     bar = "bar"; 
    } 
} 

是可接受的。

1

不,您可以在声明变量的位置初始化它。而且没有理由必须将变量与参数分配给构造函数。

+0

*“并没有理由你必须分配变量的参数给构造函数。”* - 也许我读你错了,但是......呃?如果你定义了一个实例级别的常量(这是一个非静态的final),你可以通过一个构造函数参数来初始化它。否则,如果一个类的所有实例的实例级常量都具有相同的值,那么我们也可以使其保持不变。 – 2011-04-27 00:38:53

+1

我同意。你的观点与我所说的不是相互排斥的。 – 2011-04-27 00:47:04

1

不,你不必这样做。

这两个工作正常。

public final class SomeClazz { 
    private final int test=10; 
    public SomeClazz(){ 

    } 
    public int getTest() { 
     return test; 
    } 

} 

或者

public final class SomeClazz { 
    private final int test; 
    public SomeClazz(int test){ 
     this.test = test; 
    } 
    public int getTest() { 
     return test; 
    } 

} 

然而,我更喜欢通过构造函数初始化它们,因为这样谁正在建设中的对象调用者知道如何与预期值创建对象的状态。如果它应该是一个常量类型的值,那么你应该使用Enums,而不是用这种方法在你的班级中定义它们。

+0

为了做到这一点,您不需要吸气剂。 – Jeremy 2011-04-27 01:25:29

+0

@Jeremy Heiler - 对。我的意思是将测试声明为'private'而不是默认'package private'。我已更新我的帖子。 – CoolBeans 2011-04-27 02:45:30

+0

你完全错过了我的观点。绝对不需要声明一个getter以便最终创建一个类/实例变量。 – Jeremy 2011-04-27 03:25:59

相关问题