Java 引用实例对象时,在构造函数内创建的填充HashMap返回null
第一次在这里张贴海报。我搜索了stackoverflow,但找不到这个问题的任何答案,也许我的措辞不正确 我有一个类,在这个类中,我在构造函数中创建了一个HashMap(下面的代码): 导入java.util.HashMap; 导入java.util.ArrayList 类嬉皮士扩展客户{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
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方法添加额外的逻辑,这可能特别有价值。