2016-04-07 21 views
1

I haben Klasse A, Klasse B und Klasse C.Zugreifen auf innere Klasse eines Objekts von einem anderen Objekt

Klasse B eine innere Klasse der Klasse A ist, wie unten gezeigt:

public class A { 

     public class B { 
      String day; 
      HashMap<String, ArrayList<Date>> locationTimes; 
      public B() { 
       locationTimes = new HashMap<String, ArrayList<Date>>();} 
      } 

     **B fieldB;** 

    ..... 
    } 

Verwendung Abhängigkeitsinjektion (möglicherweise nicht relevant für das Problem), injiziere ich das Objekt der Klasse A in Klasse C.

Ich versuche jetzt, auf die Felder (String Tag, HashMap locationTimes) innerhalb der Klasse B von einem anderen Objekt zuzugreifen der Klasse C. Aber ich kann das nicht.

Jede Hilfe wird geschätzt.

Antwort

3

Sie haben eine Instanz von B zu schaffen wie:

public class A { 

    private B b; 

    public B getB() { 
    return b; 
    } 

    public static class B { 
     String day; 
     HashMap<String, ArrayList<Date>> locationTimes; 

     public B() { 
      locationTimes = new HashMap<String, ArrayList<Date>>(); 
      day = "Monday" 
     } 

     public String getDay() { 
     return day; 
     } 
    } 
} 

Dann können Sie die attrbutes von B zugreifen wie folgt aus:

public class C { 
    private A a; 

    public void doSomething() { 
     a.getB().getDay(); 
    } 
} 

Edit: Sie benötigen eine Klasse B entweder private sein oder public static.

+0

in meiner Klasse C, wenn ich a.getB(). Tag es sagt "Tag" ist nicht öffentlich und kann nicht von zugegriffen werden draußen. Ich habe versucht, Klasse B mit dem gleichen Ergebnis sowohl statisch als auch privat öffentlich zu machen. – runios

+1

dann müssen Sie öffentliche Getters in Ihrer Klasse B für die Attribute schreiben. – Dimi

+0

Ich werde meine Antwort bald aktualisieren – Dimi

0

Ja, Sie müssen eine Instanz von B irgendwo haben.

In Ihrem Fall ist der Behälter eine Instanz von A wie zu erstellen:

public class C { 

@Inject 
A a; 

void someMethod() { 
    a.doit(); 
    A.B b = new A.B(); 
    b.doitToo(); // will work 
} 
} 
+0

Das Objekt "a", das ich in die Klasse injiziere, ist ein Singleton und es hat bereits das Objekt b, das von zuvor instanziiert wurde. Ich versuche jetzt, auf die Felder innerhalb des Objekts "b" zuzugreifen, aber ich kann nicht. Es besagt, dass das Feld nicht öffentlich ist und nicht von außen zugänglich ist. Ich habe versucht, Klasse B sowohl öffentliche statische und private mit dem gleichen Ergebnis zu machen – runios

+1

Sie müssen öffentliche Getter/Setter in B haben! oder mache die Felder in B öffentlich - aber das ist kein guter Codierungsstil! Schreibe eine Methode in B wie public void setSomeField (Objekt someField) {this.someField = someField;} und schreibe einen getter wie public Objekt getSomeField() {return this.someField;}. Ich bestelle, um auf die Instanz b von außerhalb c zuzugreifen, Sie müssen Getter/Setter auch in A für b haben. –

0

ich dir nicht eine Instanz der inneren Klasse bin zu raten? In diesem Fall sollten Sie das selbst machen.

Innerhalb der äußeren Klasse können Sie eine neue Instanz der inneren Klasse

public class Outer { 
    Inner myInner; 

    public Outer(){ 
     myInner = new Inner(); 
    } 
} 

Und wenn Sie die innere Klasse von außen direkt zugreifen müssen erstellen, können Sie eine Getter-Methode für diese Instanz haben.

Diese Antwort unterscheidet sich von Dimis darin, dass er Ihre innere Klasse in eine verschachtelte statische Klasse geändert hat, die sich von der ursprünglichen Frage unterscheidet. (Auch ist es unvollständig, und nicht die beabsichtigte Art, statische geschachtelte Klassen zu verwenden)

Verwandte Themen