2016-06-19 6 views
-3

どのようにして&のアクセス属性をJavaで次のように格納できますか?Javaのネストされたクラスときれいに対話する方法は?

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

次のコードが要求される何をしませんが、それは問題の背景を提供しています:

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

私のアプローチは、道オフになっている場合には、運動をしてJSONのアーキテクチャを格納することです上記のように単純にアクセスしてください。私は、ツイートのクラスを作成していて、属性の一つ内側のグループが「ユーザー」の下にある:

[...] 
"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¯\\_(ツ)_/¯)))", 
[...] 

私はエレガントな私のクラスで表現する方法を探していますのように、これらの内部変数を使用します。

foo.user.id_str ... 

ネスト/匿名クラスのタイプは正しいですか?静的修飾子を使用しても、そのようには見えません。

+0

これはネストされたクラスであり、内部クラスではありません。また、メンバ変数が静的なのはなぜですか?あなたのJSONは 'InnerTest'が' user'型のフィールドを持つべきであることを示しているようです。 –

+0

@SotiriosDelimanolisは、私が言ったように、スクラッチで遊んでいたクラスは単なる質問の背景にすぎませんでした。編集のおかげで... –

+0

GSONでシリアル化する場合は、[@SerializedName](https://google.github.io/gson/apidocs/com/google/gson/annotations/SerializedName.html)の注釈をお勧めします。下線付きの名前を変数名として使用する必要はありません。 – Jezor

答えて

1

この状況ではネストしたクラスが適しています。しかしstaticの目的を誤ってstatic classに誤解しました。これは、外部クラスのインスタンスとは独立して作成できるクラスを作成するための構文です。 ではなく、静的なフィールドとメソッドのみを持つクラスです。したがって、あなたの宣言は非静的userNameuserIdフィールドを作るために修正する必要があり

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

書いてくれてありがとう。私は訂正を感謝しますが、私は、これらの内部メンバに外部インスタンスからアクセスする方法が不足している可能性があります: 'InnerTest it = new InnerTest(); it.id = "123"; it.user.userName = "456"; ' ...すべての変数はネストされていますが、it.user.userIDなどの最小限の方法でアクセスできます。 これは単純にできませんか? –

+0

@ YumiKoizumiネストされた型に 'user'というフィールドを作成する必要があります。編集をご覧ください。 – dasblinkenlight

+0

@dasblinkinlight ...パーフェクト!ほんとうに素晴らしい!私はJavaがそれをすることができなかったと考え始めていた!ありがとうございました! :) –

1

あなたのネストされたクラス定義は、クラスにではなく、オブジェクトにバインドされている静的フィールドを、持っています。 publicに変更すると、定義は正しくなりますが、まだこのクラスのメンバ変数をInnerTestクラスに追加していません。 this answerを見ると、クラス定義とオブジェクトインスタンスの違いを明確にしています。

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

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

今、あなたは新しいInnerTestオブジェクトとアクセスuserデータあなたが意図した方法を作成することができます。

+0

私が意図したとおりに明確にしなかったのは残念です。私は同じインスタンスから内部変数にアクセスすることを意図していました。これは 'it.user.userID =" 456 ";が望ましい理由です。ネストされた構造のトンを持つJSONツイートを表すと、すべての内部クラスのインスタンスで非常に面倒なことになります。うまくいけば、javaはこれを単純に行う方法を持っています... –

関連する問題