2013-06-03 27 views
12

可能是一個非常noob問題無法理解的java

我是新來的Java和正在讀用Java編寫的第三方API的新關鍵字...

我碰到這個聲明

Foo foo = new FooBar().new Foo(); 
來到

我無法理解

FooBar().new 

爲什麼這個聲明也是這樣嗎?

有什麼好處,可以申報類似上述的東西,以及這種申報的替代方案是什麼。

任何意見/引用將不勝感激。

感謝

+2

這是一個[嵌套類](http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html)的東西。 – Santa

回答

13

FooBar包含這樣

class FooBar { 

    class Foo { 
     ... 
    } 
} 

外部類的新實例的內部類需要實例化內部類。有些類自己沒有意義,所以實現爲嵌套類。這裏FooFooBar的關係,也具有訪問所有後者的成員變量的好處。

4

請參閱@Reimeus'關於您的第一個問題的答案。

關於你的第二個問題:

有什麼選擇這樣的聲明

提供的內部類可以獨立於外部類的建立,可以使內部類靜態的,如:

public class FooBar 
{ 
    // ... 
    public static class Foo 
    { 
     // ... 
    } 
} 

然後,您將實例化:

new Foobar.Foo() 

一個經典用這種靜態內部類是類(配方從Effective Java提取 - 不要買這本書)一個生成器類。這是創建不變的情況下,以及對「流暢接口」一個很好的例子,一個很好的方式,因爲一般都建造方法返回Builder實例本身:

public class MyClass 
{ 
    public static Builder newBuilder() 
    { 
     return new Builder(); 
    } 

    private MyClass(final Builder builder) 
    { 
     // build according to data in builder 
    } 

    public static class Builder 
    { 
     private Builder() 
     { 
     } 

     // methods to add data to builder, then: 

     public MyClass build() 
     { 
      return new MyClass(this); 
     } 
    } 
} 

你會注意到靜態工廠方法newBuilder();這允許你寫:

MyClass.newBuilder() 

,而不是

new MyClass.Builder() 

創建一個建設者。