Java 引用实例对象时,在构造函数内创建的填充HashMap返回null

Java 引用实例对象时,在构造函数内创建的填充HashMap返回null,java,constructor,hashmap,Java,Constructor,Hashmap,第一次在这里张贴海报。我搜索了stackoverflow,但找不到这个问题的任何答案,也许我的措辞不正确 我有一个类,在这个类中,我在构造函数中创建了一个HashMap(下面的代码): 导入java.util.HashMap; 导入java.util.ArrayList 类嬉皮士扩展客户{ Hippie() { name = "Hippie"; HashMap<String, Double> preferences = new HashMap<String,D

第一次在这里张贴海报。我搜索了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而不是HashMap的见解都将不胜感激。谢谢

class Hippie extends Customer {

    public HashMap<String, Double> preferences;

    Hippie() {
        name = "Hippie";
        preferences = new HashMap<String,Double>();
    }
}
然后像这样使用它:-

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()); 
然后像这样使用它:-

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()); 

因此,您正在创建对HashMap的本地引用。它的范围仅限于构造函数本身。为同一个实例创建一个实例变量,并尝试在构造函数中填充它。它将起作用。

因此,您正在创建对HashMap的本地引用。它的范围仅限于构造函数本身。为同一个实例创建一个实例变量,并尝试在构造函数中填充它。它会有用的。

这个设计伤了我的眼睛

地球上没有理由在这里使用扩展。嬉皮士总是顾客吗?不是所有的
客户都有偏好吗

根本没有封装或信息隐藏。如果你一定要写这篇文章,不妨这样想:

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); 
    }
}
公共类客户{
私人地图偏好;
公众客户(){
this.preferences=新建LinkedHashMap();
}
公共双getPreference(字符串键){
返回此.preferences.get(键);
}
公共void setPreference(字符串键,双值){
this.preferences.put(键、值);
}
公共void removePreference(字符串键){
此.preferences.remove(键);
}
公共布尔值首选项(字符串键){
返回this.preferences.containsKey(键);
}
//除非你必须这么做。
公共地图getMap(){
返回Collections.unmodifiableMap(this.preferences);
}
}

这个设计伤了我的眼睛

地球上没有理由在这里使用扩展。嬉皮士总是顾客吗?不是所有的
客户都有偏好吗

根本没有封装或信息隐藏。如果你一定要写这篇文章,不妨这样想:

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); 
    }
}
公共类客户{
私人地图偏好;
公众客户(){
this.preferences=新建LinkedHashMap();
}
公共双getPreference(字符串键){
返回此.preferences.get(键);
}
公共void setPreference(字符串键,双值){
this.preferences.put(键、值);
}
公共void removePreference(字符串键){
此.preferences.remove(键);
}
公共布尔值首选项(字符串键){
返回this.preferences.containsKey(键);
}
//除非你必须这么做。
公共地图getMap(){
返回Collections.unmodifiableMap(this.preferences);
}
}

在你的构造函数中,首选项是一个局部变量。在你的构造函数中,首选项是一个局部变量。这个答案是对所述问题的正确解决方案,但我不喜欢有一个公共映射。封装和信息隐藏在哪里?不要将此作为良好实施的示例。谢谢R.J.和duffymo。我将尝试实现一个get函数来返回HashMap,希望它能起作用。谢谢不,也不要归还地图。这不是私人的——你给了任何想要改变的人一个参考。这不是一个好的抽象概念。为什么会有人关心您选择使用映射来实现呢?这个答案是对所述问题的正确解决方案,但我不喜欢使用公共映射。封装和信息隐藏在哪里?不要将此作为良好实施的示例。谢谢R.J.和duffymo。我将尝试实现一个get函数来返回HashMap,希望它能起作用。谢谢不,也不要归还地图。这不是私人的——你给了任何想要改变的人一个参考。这不是一个好的抽象概念。为什么会有人关心您选择使用映射实现呢?在这些相同的封装/信息隐藏行中,getMap()可以替换为映射键集的get。这将允许其他人看到存在哪些键,但会迫使他们通过其他方法返回,以实际与数据交互。如果您想向get/set/remove方法添加额外的逻辑,那么这可能特别有用。按照相同的封装/信息隐藏行,getMap()可以替换为映射键集的get。这将允许其他人看到存在哪些键,但会迫使他们通过其他方法返回,以实际与数据交互。如果您想向get/set/remove方法添加额外的逻辑,这可能特别有价值。