1

第一次在这里发海报。我通过stackoverflow搜索但找不到这个问题的任何答案,也许我的措辞不正确。

我有一个类,我在构造函数中创建一个 HashMap(下面的代码):

导入 java.util.HashMap;导入 java.util.ArrayList;

类嬉皮扩展客户{

Hippie() {
    name = "Hippie";

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

}

}

不幸的是,当我创建上面的“Hippie”对象的实例时,即使构造函数成功完成,对实例对象中 HashMap 的任何引用都返回 null。

公共类 SEJavaDemo{ 公共静态 void main(String[] args){

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

}

}

例如,上面的代码打印出来:

零嬉皮士

我的最终目标是能够访问由 Hippie 构造函数创建的 HashMap。任何关于它为什么返回 null 而不是 HashMap 的见解将不胜感激。谢谢!

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

这个设计伤了我的眼睛。

地球上没有理由在这里使用扩展。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 回答