public class Code{
//many properties
//...
final String NEWLINE;// ohh a final property!
void creation() //this method is for avoid repetition of code
{
//final initialization can't be put here =(
Source= new StringBuffer();
//many other commons new's ..
//...
}
Code()
{
NEWLINE = System.getProperty("line.separator");
creation();
}
Code(String name, int numberr)
{
NEWLINE = System.getProperty("line.separator");
creation();
name=new Someting(name);
number = new Magic(number);
}
回答
這是你的代碼,有4種不同的初始化最終變量的方法。
- 直列
- 匿名初始化塊
- 在構造
- 初始化調用默認構造明確
所產生的輸出如下所示。
public class Code {
// many properties
private String name;
private String number;
// ...
// 1.
final String NEWLINE_1 = "1" + System.getProperty("line.separator");
final String NEWLINE_2;
final String NEWLINE_3;
// 2.
{
System.out.println("initializer block invoked before Constructor");
NEWLINE_2 = "2" + System.getProperty("line.separator");
// final initialization CAN be put here =(
// Source = new StringBuffer();
// many other commons new's ..
// ...
}
Code() {
System.out.println("default constructor");
// NEWLINE_1 = "error"; can't do this
// NEWLINE_2 = "error"; can't do this
// 3.
NEWLINE_3 = "3" + System.getProperty("line.separator");
}
Code(String name, int number) {
// 4.
this();
System.out.println("constructor(name, number)");
name = new String("Someting(name)");
this.number = new String("Magic(number)");
}
public static void main(String[] args) {
Code code_1 = new Code();
System.out.println(code_1.NEWLINE_1 + ":" + code_1.NEWLINE_2 + ":" + code_1.NEWLINE_3);
Code code_2 = new Code("crowne", 2);
System.out.println(code_2.NEWLINE_1 + ":" + code_2.NEWLINE_2 + ":" + code_2.NEWLINE_3);
}
}
initializer block invoked before Constructor
default constructor
1
:2
:3
initializer block invoked before Constructor
default constructor
constructor(name, number)
1
:2
:3
只要做到:
final String NEWLINE = System.getProperty("line.separator");
參見:JLS 8.3.2. Initialization of Fields。
另請參閱:JLS 12.5 Creation of New Class Instances執行順序。
什麼時候執行該行? at自動創建第一個對象? – 2010-03-31 19:29:22
無論如何,這個字段應該是靜態的,但這不是重點。 – 2010-03-31 19:50:02
如果它們每次都以相同的方式初始化,那麼可以將代碼放在構造函數之外。 Java允許你做:
final String NEWLINE = System.getProperty("line.separator");
你也可以有比無參數調用一個無參數的構造函數以外的所有構造函數。例如:
Code(String name, int number)
{
this();
name=new Someting(name);
number = new Magic(number);
}
編譯器將所有初始值設定項添加到每個構造函數的開頭。這包括:
- 實例變量初始化
- 初始化塊
{ .. }
所以你不必包含這個無處不只是將它放在作爲一個實例變量初始化:
private final String NEWLINE = System.getProperty("line.separator");
或在初始化塊中:
{
NEWLINE = System.getProperty("line.separator");
}
當然,在這個精確的例子中,你應該使字段static
。
一個,如果初始化是複雜的,你必須在施工期間做到這一點,提供了一個靜態方法的返回結果,如:
Code()
{
NEWLINE = newLineValue();
creation();
}
Code(String name, int number)
{
NEWLINE = newLineValue();
creation();
name = new Something(name);
number = new Magic(number);
}
private static String newLineValue()
{
return System.getProperty("line.separator");
}
在這情況下,newLineValue()
是微不足道的,所以我不會在這裏使用它,但如果這實際上有大量的工作,那麼它可能是有用的。您也可以從構造函數傳入參數。
- 1. 屬性:避免代碼複製
- 2. 如何避免重複以下代碼?
- 3. 避免代碼重複
- 4. 避免重複SQL代碼?
- 5. C#避免重複代碼
- 6. 避免代碼重複
- 7. 避免重複代碼xlsxwritter
- 8. jQuery避免代碼重複
- 9. 如何避免初始化已經初始化的變量?
- 10. 避免在類成員初始化程序中重複類型?
- 11. SQL Server 2008複製(避免重新初始化)
- 12. 如何避免重複代碼的靜態多態性
- 13. 在對象實例化後初始化最終屬性
- 14. 如何避免重新初始化永不改變的類?
- 15. 矩陣初始化 - 如何避免重疊?
- 16. 避免重複的QuickCheck屬性
- 17. 避免複製粘貼代碼初始化struct中的一系列SDL_Rects
- 18. 最終局部變量如何避免重複調用方法?
- 19. 如何避免在ASP.NET中重複調用我的初始化方法?
- 20. 最終變量初始化
- 21. 初始化屬性
- 22. 避免屬性序列化
- 23. Golang抽象,以避免重複代碼
- 24. Jquery的 - 避免代碼重複
- 25. 避免在swift中重複代碼
- 26. 避免重複的代碼(PHP)
- 27. C#泛型避免代碼重複?
- 28. c#避免拳擊和重複代碼
- 29. 爲了避免代碼重複
- 30. Python |避免重複代碼塊
+1「// ohh最後的屬性!「和一個有用的Q總體:) – DVK 2010-03-31 19:31:20
爲什麼你的NEWLINE是一個實例變量?我會聲明類似於這個靜態的。我懷疑line.separator會在JVM實例的生命週期內改變。 – Uri 2010-03-31 20:02:37