1

初ポスターはこちら。stackoverflow を検索しましたが、この質問に対する回答が見つかりませんでした。おそらく、言い方が間違っているのでしょう。

コンストラクター内で HashMap を作成するクラスが 1 つあります (以下のコード)。

java.util.HashMap をインポートします。import java.util.ArrayList;

class Hippie extends Customer {

Hippie() {
    name = "Hippie";

    HashMap<String, Double> preferences = new HashMap<String,Double>();
    preferences.put("Donuts", 1.5);
    preferences.put("Biscotti", 0.5);

}

}

残念ながら、上記の「ヒッピー」オブジェクトのインスタンスを作成すると、インスタンス オブジェクト内の HashMap への参照は、コンストラクターが正常に完了しても null を返します。

public class SEJavaDemo{ public static void main(String[] args){

Hippie Billy = new Hippie();
System.out.println(Billy.preferences);
System.out.println(Billy.name);

}

}

たとえば、上記のコードは次のように出力します。

null ヒッピー

私の最終的な目標は、Hippie コンストラクターによって作成された HashMap にアクセスできるようにすることです。HashMap ではなく null を返す理由についての洞察をいただければ幸いです。ありがとう!

4

3 に答える 3

5
class Hippie extends Customer {

    public HashMap<String, Double> preferences;

    Hippie() {
        name = "Hippie";
        preferences = new HashMap<String,Double>();
    }
}

preferences、 内で作成されるため、外部クラスには表示されませんconstructor。インスタンス変数として宣言し、コンストラクターで初期化して、外部クラスから見えるようにする必要があります。

についても同様nameです。

これで問題が解決するかもしれませんが、次のようなことをお勧めします:-

class Hippie extends Customer {

        private HashMap<String, Double> preferences

        Hippie() {
            name = "Hippie";
            preferences = new HashMap<String,Double>();
        }

    // have a getter for the hashmap
    public HashMap<String,Double> getMap(){
        return preferences;
    }
}

そして、次のように使用します:-

Hippie billy = new Hippie(); // Couldn't digest `Billy` as object name.
System.out.println(billy.getMap()); 
于 2013-03-23T10:30:00.140 に答える
1

結果として、HashMap へのローカル参照を作成しています。そのスコープは、コンストラクター自体に限定されます。同じインスタンス変数を作成し、コンストラクターに入力してみてください。それが動作します。

于 2013-03-23T10:33:29.103 に答える
0

このデザインは目が痛いです。

ここで extends を使用する理由はまったくありません。IS-AHippieは常にCustomer? みんなCustomers好みじゃないの?

カプセル化や情報の隠蔽はまったくありません。これを書かなければならない場合は、次のように考えてください。

public class Customer {
    private Map<String, Double> preferences; 

    public Customer() {
        this.preferences = new LinkedHashMap<String, Double>();
    }

    public Double getPreference(String key) {
        return this.preferences.get(key);
    }

    public void setPreference(String key, Double value) {
        this.preferences.put(key, value);
    }

    public void removePreference(String key) {
       this.preferences.remove(key);
    }

    public boolean hasPreference(String key) {
        return this.preferences.containsKey(key);
    }

    // ONLY if you must.
    public Map<String, Double> getMap() {
        return Collections.unmodifiableMap(this.preferences); 
    }
}
于 2013-03-23T11:01:06.600 に答える