BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #56235同步于 2017/5/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

【问题】如何实现带参数的单例模式?

lhy963
2017/5/10镜像同步15 回复
假设有两个参数x,y. 方法`getInstance(int x,int y)`要确保x和y相同时返回的是同一对象,如何实现? 初步想到一个办法是在单例类里面装一个HashMap,key是<x,y>,value是实例,但是又如何确保x和y相同对应了相同的key呢? 如果Java不好写,用其他语言实现亦可。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
chenxiansf机器人#1 · 2017/5/10
x和y相同<x,y>不就相同了吗
lhy963机器人#2 · 2017/5/10
可是hashmap的key不能是两个啊。。。如果用一个类封装又会有点问题啊 【 在 chenxiansf 的大作中提到: 】 : x和y相同<x,y>不就相同了吗
chenxiansf机器人#3 · 2017/5/10
那就封装啊,没问题吧 【 在 lhy963 (bzsgcx) 的大作中提到: 】 : 可是hashmap的key不能是两个啊。。。如果用一个类封装又会有点问题啊
lhy963机器人#4 · 2017/5/10
没那么简单吧,看下面代码: ``` 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 的大作中提到: 】 : 那就封装啊,没问题吧
chenxiansf机器人#5 · 2017/5/10
Pair要重写hashcode什么的搞一搞吧 【 在 lhy963 (bzsgcx) 的大作中提到: 】 : 没那么简单吧,看下面代码: : [md] : ...................
lhy963机器人#6 · 2017/5/10
@nuanyangyang 召唤大神
linsiy机器人#7 · 2017/5/10
参考hashmap实现方法行不行。先可以自定义一个hashcode(根据x和y数值),然后你在MyClass类里面自定义一个map,key为hashcode,value为一个自定义的链表(存储已创建的MyClass实例)。在创建实例时先计算hashcode,找map中有没有这个值,如果有再接着找value链表中存储的有没有需要的实例,有则返回,无则添加;如果没有这个hashcode,则直接在map中添加 【 在 lhy963 (bzsgcx) 的大作中提到: 】 : 没那么简单吧,看下面代码: : [md] : ...................
lhy963机器人#8 · 2017/5/10
跟我的思路差不多,我现在的想法是在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中添加
linsiy机器人#9 · 2017/5/10
你要是确定以后类不会存long型的这样做当然可以。存链表是我考虑如果hashcode是int型会存在x和y都不同而hashcode相同的情况,这样需要解决冲突,就和hashmap的拉链法思路一样 【 在 lhy963 (bzsgcx) 的大作中提到: 】 : 跟我的思路差不多,我现在的想法是在MyClass里面写一个`HashMap<Long, MyClass>`,key是long的,高4字节放x,低4字节放y,value是MyClass实例。 : 不过要链表干啥用,x和y确定了,实例就是唯一的了