2014-03-05 61 views
0

先編碼。當與類名具有相同的方法名稱時如何實例嵌套類?

class A 
{ 
    private A(){} 
    public static A.Builder Builder() 
    { 
     /** 
     * ERROR: 
     * No enclosing instance of type A is accessible. 
     * Must qualify the allocation with an enclosing instance of type A 
     * (e.g. x.new A() where x is an instance of A). 
     */ 
     return new A.Builder(); 
     // Error too 
     //return new Builder(); 
    } 

    public class Builder 
    { 
     private Builder() 
     {} 
    } 
} 

問:如何實例構建器,但不要更改靜態生成器和嵌套類名?

編輯

如果類是靜態的,如何節約每一個建設者的日期?如何鏈接構建過程?

public static class Builder 
{ 
    private Builder() 
    {} 

    public Builder add(int a) 
    { 
     return this;// how to chain the build process ? 
    } 
    public Builder add(float a); 
    public List<Double> Build(); 
} 

好的,我應該首先谷歌Java生成器模式。 Here就是一個例子。

+0

請不要編輯以提出一個無關的新問題。問一個新的。 – aalku

回答

2

規則:如果內部類在封閉類之外使用,它必須是靜態的。

public static class Builder 
{ 
    private Builder() 
    { 

    } 
} 

這是設計。

+0

你從哪裏引用?效果java?但是你不回答這個問題,有可能在那裏上課嗎? – wener

+0

@ wener這不是一句話,它是個人的知識。 :-)如果有疑問,谷歌它。 – GGrec

+0

我更新我的問題。謝謝你的建議。 – wener

1

爲了讓編譯未做嵌套類靜態的,你需要一個實例:

A a = new A(); 
return a.new Builder(); 

或較短的版本:

​​

但它可能會更有意義使用一個嵌套的靜態類而不是內部類,所以你可以實例化一個新的Builder而不必創建一個新的A ..

0

你的代碼有幾個錯誤或不好的做法。 該課程的名稱與您的問題無關。

構造函數看起來像方法,但它們不是。你可能會認爲這是一個方法叫做生成器,但它不是,它是一個構造函數,構造函數沒有返回類型+名稱,但只是類的名稱:

public class Builder 
{ 
    private Builder() // <-- CONSTRUCTOR 
    {} 
} 

但是,這是一個靜態方法:

class A 
{ 
    public static A.Builder Builder() <-- METHOD (with return type and name) 
     { ... } 
} 

的方法名稱應以小寫字母開始(這不會影響構造函數),所以這是一個錯誤,它應該被命名爲builder()

編譯問題意味着您正嘗試在靜態上下文(類A的靜態方法構建器)內創建非靜態內部類的對象。你不能這樣做,因爲非靜態內部類實例必須綁定到外部類的實例。

如果您不希望A.Builder實例與A實例相關,請將其設爲靜態。如果您希望綁定它們,請在A的非靜態方法(或構造函數)內創建A.Builder的實例,或使用assylias指出的語法A a = new A(); Builder = a.new Builder();。在這兩種情況下,您都會得到一個綁定到實例A的Builder的新實例。

0

實際上,我需要的是一個靜態類,它與C#的靜態類 不同。 Here 是一個很好的解釋。 如果一個嵌套類不是靜態的,它需要一個實例化的容器類。 這是我如何理解java中的靜態類。

相關問題