返回信息流假设有两个参数x,y.
方法`getInstance(int x,int y)`要确保x和y相同时返回的是同一对象,如何实现?
初步想到一个办法是在单例类里面装一个HashMap,key是<x,y>,value是实例,但是又如何确保x和y相同对应了相同的key呢?
如果Java不好写,用其他语言实现亦可。
这是一条镜像帖。来源:北邮人论坛 / java / #56235同步于 2017/5/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
【问题】如何实现带参数的单例模式?
lhy963
2017/5/10镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
可是hashmap的key不能是两个啊。。。如果用一个类封装又会有点问题啊
【 在 chenxiansf 的大作中提到: 】
: x和y相同<x,y>不就相同了吗
那就封装啊,没问题吧
【 在 lhy963 (bzsgcx) 的大作中提到: 】
: 可是hashmap的key不能是两个啊。。。如果用一个类封装又会有点问题啊
没那么简单吧,看下面代码:
```
public class MyClass {
private static HashMap<Pair, MyClass> map = new HashMap<>();
private class Pair {
int x,y;
public Pair(int x,int y) {
this.x=x;
this.y=y;
}
}
private MyClass() {
}
public MyClass getInstance(int x,int y) {
}
}
```
getInstance怎么写??
你总不能写`if(map.contains(new Pair(x,y)) ...`吧
【 在 chenxiansf 的大作中提到: 】
: 那就封装啊,没问题吧
Pair要重写hashcode什么的搞一搞吧
【 在 lhy963 (bzsgcx) 的大作中提到: 】
: 没那么简单吧,看下面代码:
: [md]
: ...................
参考hashmap实现方法行不行。先可以自定义一个hashcode(根据x和y数值),然后你在MyClass类里面自定义一个map,key为hashcode,value为一个自定义的链表(存储已创建的MyClass实例)。在创建实例时先计算hashcode,找map中有没有这个值,如果有再接着找value链表中存储的有没有需要的实例,有则返回,无则添加;如果没有这个hashcode,则直接在map中添加
【 在 lhy963 (bzsgcx) 的大作中提到: 】
: 没那么简单吧,看下面代码:
: [md]
: ...................
跟我的思路差不多,我现在的想法是在MyClass里面写一个`HashMap<Long, MyClass>`,key是long的,高4字节放x,低4字节放y,value是MyClass实例。
不过要链表干啥用,x和y确定了,实例就是唯一的了
【 在 linsiy 的大作中提到: 】
: 参考hashmap实现方法行不行。先可以自定义一个hashcode(根据x和y数值),然后你在MyClass类里面自定义一个map,key为hashcode,value为一个自定义的链表(存储已创建的MyClass实例)。在创建实例时先计算hashcode,找map中有没有这个值,如果有再接着找value链表中存储的有没有需要的实例,有则返回,无则添加;如果没有这个hashcode,则直接在map中添加
你要是确定以后类不会存long型的这样做当然可以。存链表是我考虑如果hashcode是int型会存在x和y都不同而hashcode相同的情况,这样需要解决冲突,就和hashmap的拉链法思路一样
【 在 lhy963 (bzsgcx) 的大作中提到: 】
: 跟我的思路差不多,我现在的想法是在MyClass里面写一个`HashMap<Long, MyClass>`,key是long的,高4字节放x,低4字节放y,value是MyClass实例。
: 不过要链表干啥用,x和y确定了,实例就是唯一的了