2016-06-19 11 views
-3

Wie kann man in Java die Zugriffsattribute & speichern?Wie sauber interagieren mit geschachtelter Klasse in Java?

InnerTest it = new InnerTest(); 
it.id = "123"; 
it.user.userID = "456"; 

der folgende Code nicht tut, was erwünscht ist, aber es bietet eine Kulisse für die Frage:

public class InnerTest { 
    public String id; 
    static class user { 
     static String userName; 
     static String userID; 
    } 
} 

Falls mein Ansatz ist, ist unter der Übung eine JSON-Architektur speichern in eine Klasse, aber greifen Sie einfach wie oben beschrieben darauf zu. Ich erstelle eine Klasse für Tweets, und eine innere Gruppe von Attributen ist unter „user“:

[...] 
"in_reply_to_user_id" : null, 
    "in_reply_to_user_id_str" : null, 
    "in_reply_to_screen_name" : null, 
    "user" : { 
    "id" : 19792676, 
    "id_str" : "19792676", 
    "name" : "(((Payne¯\\_(ツ)_/¯)))", 
[...] 

ich nach einem Weg suchen, um elegant in meiner Klasse darstellt verwenden, um die inneren Variablen, wie in:

foo.user.id_str ... 

Ist eine Art verschachtelte/anonyme Klasse korrekt? Es sieht nicht aus wie es ist - selbst mit statischen Modifikatoren ...

+0

Das ist eine geschachtelte Klasse, keine innere Klasse. Warum sind die Membervariablen überhaupt statisch? Ihr JSON scheint anzuzeigen, dass ein 'InnerTest' ein Feld vom Typ' user' haben sollte. –

+0

@StiriosDelimanolis, wie ich schon sagte, die Klasse, mit der ich spielte, war nur ein Hintergrund für die Frage. Vielen Dank für die Änderungen ... –

+0

Wenn Sie mit GSON serialisieren, empfehle ich Ihnen die Annotation [@SerializedName] (https://google.github.io/gson/apidocs/com/google/gson/annotations/SerializedName.html) . Sie müssen die unterstrichenen Namen nicht als Variablennamen verwenden. – Jezor

Antwort

1

Verschachtelte Klasse ist eine gute Wahl in dieser Situation. Sie haben jedoch den Zweck von static in einer static class missverstanden - das ist eine Syntax zum Erstellen von Klassen, die unabhängig von der Instanz ihrer äußeren Klasse erstellt werden können. Es ist nicht eine Klasse, die nur statische Felder und Methoden haben muss.

public class InnerTest { 
    public String id; 
    public UserType user = new UserType(); 
    static class UserType { 
     String userName; 
     String userID; 
    } 
} 
+0

danke fürs schreiben. Ich schätze die Korrektur, aber vielleicht fehlt mir der Zugang zu diesem inneren Glied aus der äußeren Instanz, a la: 'InnerTest it = new InnerTest(); it.id = "123"; it.user.userName = "456"; ' ... wo alle Variablen, egal wie verschachtelt, auf eine minimalistische Art und Weise zugegriffen werden kann, wie zum Beispiel: it.user.userID, etc. Ist das nicht möglich? –

+0

@YumiKoizumi Sie müssen ein Feld mit dem Namen 'user' für den geschachtelten Typ erstellen. Bitte beachten Sie die Änderung. – dasblinkenlight

+0

@dasblinkinlight ... Perfekt! Echt super! Ich fing an zu denken, dass Java das nicht konnte! Vielen Dank! :) –

1

Ihre verschachtelte Klassendefinition haben statische Felder, die zu einer Klasse gebunden sind und nicht auf Objekte:

Daher sollten Sie Ihre Erklärung userName und userId Felder nicht statisch machen fixiert werden. Wenn wir sie in public ändern, ist die Definition korrekt, obwohl Sie in der Klasse InnerTest noch keine Membervariable dieser Klasse hinzugefügt haben. Schauen Sie sich this answer an, es verdeutlicht den Unterschied zwischen Klassendefinition und Objektinstanz.

public class InnerTest { 
    public String id; 
    public User user; 

    static class User { 
     public String userName; 
     public String userID; 
    } 
} 

Jetzt können Sie ein neues Objekt InnerTest und Zugang user Daten so, wie Sie beabsichtigten erstellen.

+0

Es tut mir leid, dass ich nicht klarer gemacht habe, wie ich es beabsichtigt habe.Ich beabsichtigte, auf innere Variablen von derselben Instanz zuzugreifen, um zu vermeiden, dass viele Instanzen eine einzelne Klasse repräsentieren (ganz oben). Aus diesem Grund ist 'it.user.userID =" 456 ";" erwünscht. Die Darstellung eines JSON-Tweets, der eine Menge verschachtelter Strukturen enthält, würde sehr schnell mit Instanzen aller inneren Klassen unordentlich werden. Hoffentlich hat Java eine Möglichkeit, dies einfach zu tun ... –

Verwandte Themen