public static void main(String[] args) {
HashMap hash = new HashMap();
hash.put("a","1");
test1.test11(hash);
} public void test11(HashMap h){
h.put("a","2");
System.out.println(h);
}
大家都知道java中对引用是直接可以改变其值,如上面的例子 输出得是 {a = 2 }
那么请问如何可以做到输出的结果依然是{a = 1}呢?(除了h.clone方法)
就是说在方法 test11中对传入的参数进行操作,但是不改变它的值,有最好的办法么?
希望和各位成为朋友我的msn:[email protected]
HashMap hash = new HashMap();
hash.put("a","1");
test1.test11(hash);
} public void test11(HashMap h){
h.put("a","2");
System.out.println(h);
}
大家都知道java中对引用是直接可以改变其值,如上面的例子 输出得是 {a = 2 }
那么请问如何可以做到输出的结果依然是{a = 1}呢?(除了h.clone方法)
就是说在方法 test11中对传入的参数进行操作,但是不改变它的值,有最好的办法么?
希望和各位成为朋友我的msn:[email protected]
1.是被楼主禁用的clone
2.使HashMap变成一个不可变对象
看看javaeye的这个精华贴吧!
这边的很多人可能都没有搞清楚java里面的这个基础问题!
在java基础的精华区。
《如何完全clone 一个HashMap?》
你可以去看看,基本上没有结果。只能用序列化。
就算加了final也不行的
public static void main(String[] args) {
HashMap hash = new HashMap();
hash.put("a","1");
test11(hash);
System.out.println(hash);
} public static void test11(HashMap hash){
HashMap h = new HashMap();
h.put("a","2");
hash = h;
System.out.println(hash);
}
}->这样好像不符合楼主的要求 回复人: gogon() ( ) 信誉:100 2005-10-18 12:54:00 得分: 0
楼上的,第二个方法做不到吧
就算加了final也不行的
->第二个方法不是单纯加final就可以了
如果是包含另一个map那么需要对里面的它也进行clone,这样会很麻烦的
一楼请问如果让它变成不可变对象?
谢谢
同时也谢谢大家的帮助
HashMap hash = new HashMap();
hash.put("a","1");
test1.test11(hash);
} public void test11(HashMap h){
h.put("a","2");
System.out.println(h);
}
如果test11()方法中不做任何改动,只在main方法中做改动,就是说test11()方法只是一个黑盒子
在里面有固定的操作,外界对他所知的就是参数类型,有些方法调用test11()需要改变传入参数得值,而有些则不需要改变
该怎么去做?
HashMap hash = new HashMap();
hash.put("a","1");
HashMap hh = new HashMap();
test1.test11(hh);
} public void test11(HashMap h){
h.put("a","2");
System.out.println(h);
}
如果你想在语言层面解决这个问题。那么很遗憾的告诉你,不行,
core java或者是 thinking in java里面明确的指出java并没有
cpp里面的 const 关键字。
final指能够防止它所保护变量(或者变量的引用)不被被修改,
但不能够防止引用的成员数据的或者成员函数对成员数据的改变。
而cpp的函数可以定义 int fun() const;能够保证
成员函数不能修改数据成员。实际上cpp是通过 const修饰this指针的指向来实现。
而不仅仅是限制this指针。
在cpp中定义一个 const对象时编译器会将 const 修饰字自动的扩展到
所定义的对象的 成员数据, 成员函数 身上。
如果const对象的类的某些成员函数改变了某些成员数据,那么cpp的编译器将会检查出来。
要求你提供一个 同名的 int fun() const;形式的版本的 成员函数。
你需要的功能是这样子被cpp简单又和谐地解决的。
java的final 对引用的修饰 的功能只有 const一半。
只能修饰 变量引用的本身,不能修饰变量引用的指向。而且也不能修饰到成员函数的本身(可以那么用,但是不是这里期望的意思)。
因此,在语言层面(在编译时候)不能够解决你要的那种功能。但是如果要达到你的目的,也是有办法的。但是不能够与原有的代码兼用。
第一种:
对类HashMap进行封装,
在每次put进去前检查。是否已经有值,如果有值,则抛异常阿忽略并返回假值阿等操作。
第二种:运用反射机制。实行传说中的代理模式。
把对hashMap的使用全都扔给代理。
或许还有别的方式的,
但是无论是那种方式,都不能够改变旧的代码实现。
又假设c++实现了类似java里面的HashMap
也同样不可能通过某些“语言形式”去满足楼主的要求。使用一个不能增删改的只读HashMap没有意义(不如直接定义常量)而执行了下面两句
h.put("a","2");
System.out.println(h);
却要输出a=1这纯粹是一种软件需求,如果直接这样写,就是你的程序流程
有问题,为了实现这样的需求,比如说,可以这样写:
if(!h.containsKey("a"))h.put("a","2");
System.out.println...
h.put("a","2");
System.out.println(h);
要求输出 "1"举这样的例子应当是为了说明他的目的吧。
HashMap hash = new MyHashMap();
hash.put("a","1");
test1.test11(hash);
} public void test11(HashMap h){
h.put("a","2");
System.out.println(h);
}class MyHashMap extends HashMap {
public Object put(Object key, Object value) {
if (containsKey(key)) {
return get(key);
}
return super.put(key, value);
}
}又,楼主的需求,不想是java的基础问题,反倒是像量子力学的基础问题