2013-06-03 12 views
12

prawdopodobnie bardzo noob pytaniestanie zrozumieć nowe słowo kluczowe w java

Jestem nowy Java i czytam trzecią api partii napisany w Javie ...

natknąłem tej deklaracji

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

Jestem w stanie zrozumieć

FooBar().new 

Dlaczego ta deklaracja w ten sposób?

Jakie korzyści można uzyskać deklarując coś takiego jak powyżej i jakie są alternatywy dla takiej deklaracji.

Wszelkie porady/referencje byłyby mile widziane.

THanks

+2

Jest to rzecz [klasa zagnieżdżona] (http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html). – Santa

Odpowiedz

13

FooBar zawiera wewnętrzną klasy jak to

class FooBar { 

    class Foo { 
     ... 
    } 
} 

nową instancję zewnętrznej klasy jest wymagana do wystąpienia wewnętrzną klasy. Niektóre klasy nie mają sensu same w sobie, więc są implementowane jako klasy zagnieżdżone. Tutaj Foo ma związek z FooBar, a także ma tę zaletę, że ma dostęp do wszystkich zmiennych członkowskich tego ostatniego.

4

Zobacz odpowiedź @Reimeus na pierwsze pytanie.

Co do drugiego pytania:

jakie są alternatywy dla takiej deklaracji

Świadczone wewnętrzna klasy mogą być tworzone niezależnie od zewnętrznej klasy, można dokonać wewnętrzną klasę statyczny, jak w:

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

Wtedy byś wystąpienia z:

new Foobar.Foo() 

Klasycznym zastosowanie takiej statycznej klasie wewnętrznej jest klasa konstruktora dla klasy (receptur pochodzących z Effective Java - czy kupić tę książkę). Jest to dobry sposób na stworzenie niezmienne instancji, jak również dobry przykład „biegle interfejsów”, ponieważ na ogół wszystkie metody konstruktora powrócić instancję budowniczy sam:

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); 
     } 
    } 
} 

Zauważysz statycznej metody fabryki newBuilder(); to pozwala na pisanie:

MyClass.newBuilder() 

zamiast

new MyClass.Builder() 

stworzyć Builder.