菜鸟求助:创建哈希表的问题

Domino0627 2009-12-30 01:59:41
我现在有如下需求:
A用户访问JavaAgent类的NotesMain方法,希望这个时候判断下服务器内存中是否有一个哈希表,如果没有,则创建,有责找到哈希表,向哈希表里put值。
因为涉及到B用户 C用户都可能访问这个类的这个方法,所以不知道怎么创建一个唯一的哈希表供其他用户向操作,也就是不知道怎么去保证只有一个哈希表。
希望能在我下面的代码上简单的给个提示。

import lotus.domino.*;

public class JavaAgent extends AgentBase {

static private HashMap userMap = new HashMap();

public void NotesMain() {

try {
//这里是我的业务,主要在这里向哈希表里面put值
} catch(Exception e) {
e.printStackTrace();
}
}

}
...全文
249 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
bobo364 2009-12-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 crazylaa 的回复:]
楼主代码没问题啊。
有问题的可能是你import少了domino的东西吧?
我把domino的去掉,执行了可以的。
[/Quote]

进行了同样的尝试,结果也相同
pjw100 2009-12-31
  • 打赏
  • 举报
回复
单例模式,最简单的一种设计模式。去看看吧。
JavaAlpha 2009-12-31
  • 打赏
  • 举报
回复
加个断点跟一下 看看 为什么出错
  • 打赏
  • 举报
回复
IBM外包的?
bayougeng 2009-12-31
  • 打赏
  • 举报
回复
典型的单例模式嘛。
999朵玫瑰 2009-12-31
  • 打赏
  • 举报
回复
AgentBase
dongyangmoney 2009-12-31
  • 打赏
  • 举报
回复
jf
yueyastudio 2009-12-31
  • 打赏
  • 举报
回复
楼主能不能你调试的错误信息贴出来,还你跟踪错误出在哪里!
crazylaa 2009-12-31
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 domino0627 的回复:]
我现在上面的代码执行完以后,再次执行没有得到原来的那个哈希表,又创建了一个新的哈希表。

希望高手能把我上面的代码改改,谢谢了,再送100分。
[/Quote]

晕死,这两个都要private,否则不是单例了,构造方法都没有私有,咋单例啊。
public static HashMap userMap = new HashMap();

public Singleton(){

}

再晕,这里不能new,你原来那段是对的,利用getInstance来获取唯一实例。
public void aTest()throws Exception{

Singleton s = new Singleton();
HashMap userMap = s.getInstance().userMap;

}
即(下面这个红色的方法要在你的单例中提供)。
HashMap userMap = Singleton.getInstance().getUserMap();

另外,你测试发现又new了一个是吗?可能是你的测试类有问题。

试试下面的(跟你原来的基本没区别):

package test;

import java.util.HashMap;

public class JavaAgent {

private static JavaAgent instance = null;

private HashMap<String, Long> userMap = new HashMap<String, Long>();

private JavaAgent() {

}

public static JavaAgent getInstance() {

if (instance == null) {

instance = new JavaAgent();

}

return instance;

}

public HashMap getUserMap() {
return userMap;
}

public void NotesMain(String name, Long value) {
try {
userMap.put(name, value);
} catch (Exception e) {
e.printStackTrace();
}
}
}



package test;

import java.util.Iterator;
import java.util.Map.Entry;

public class TS {
public static void main(String[] a) {

String queryString = "aaaaaaaaaaaaaaaaaaaaaaaaa";
String userName = queryString.substring(queryString
.indexOf("userName=")
+ "userName=".length(), queryString.length());

Long currentTime = new Long(System.currentTimeMillis());
JavaAgent.getInstance().NotesMain(userName, currentTime);
Iterator it = JavaAgent.getInstance().getUserMap().entrySet()
.iterator();

while (it.hasNext()) {
Entry entry = (java.util.Map.Entry) it.next();
String userLogonName = (String) entry.getKey();
Long userLogonTime = (Long) entry.getValue();
System.out.println(userLogonName + "=" + userLogonTime);
}
System.out.println("One Done!");
queryString = "bbbbbbbbbbbbbbbb";
userName = queryString.substring(queryString.indexOf("userName=")
+ "userName=".length(), queryString.length());

currentTime = new Long(System.currentTimeMillis());
JavaAgent.getInstance().NotesMain(userName, currentTime);
it = JavaAgent.getInstance().getUserMap().entrySet().iterator();

while (it.hasNext()) {
Entry entry = (java.util.Map.Entry) it.next();
String userLogonName = (String) entry.getKey();
Long userLogonTime = (Long) entry.getValue();
System.out.println(userLogonName + "=" + userLogonTime);
}
System.out.println("Two Done!");

}
}


Domino0627 2009-12-31
  • 打赏
  • 举报
回复
我现在上面的代码执行完以后,再次执行没有得到原来的那个哈希表,又创建了一个新的哈希表。

希望高手能把我上面的代码改改,谢谢了,再送100分。
Domino0627 2009-12-31
  • 打赏
  • 举报
回复

import java.util.HashMap;

public class Singleton {

private static Singleton instance = null;
public static HashMap userMap = new HashMap();

public Singleton(){

}

public static synchronized Singleton getInstance() {

if(instance == null) {

instance = new Singleton();
}

return instance;

}
}

import java.util.HashMap;
import org.junit.Test;

public class ATest {
@Test
public void aTest()throws Exception{

Singleton s = new Singleton();
HashMap userMap = s.getInstance().userMap;

}
}

我看资料说,单例模式必须要求单例类里面构造方法是私有的,但是我把构造方法已变成私有的,调试类里就报错。高手们帮我看看吧,解决问题者我再看一个帖子送100分。
crazylaa 2009-12-31
  • 打赏
  • 举报
回复
楼主代码没问题啊。
有问题的可能是你import少了domino的东西吧?
我把domino的去掉,执行了可以的。
晴天1999 2009-12-30
  • 打赏
  • 举报
回复
新手哈!多多的指教哟!
Domino0627 2009-12-30
  • 打赏
  • 举报
回复
全部代码贴出,望高手解答。

import lotus.domino.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

public class JavaAgent extends AgentBase {

private static JavaAgent instance = null;
static private HashMap userMap = new HashMap();

private JavaAgent(){

}

public static JavaAgent getInstance(){

if(instance == null){

instance = new JavaAgent();

}

return instance;

}



public void NotesMain() {

try {

Session session = getSession();
AgentContext agentContext = session.getAgentContext();

Document doc = agentContext.getDocumentContext();
Item item = doc.getFirstItem("Query_String_decoded");
String queryString = item.getText();
String userName = queryString.substring(queryString.indexOf("userName=") + "userName=".length(), queryString.length());

Long currentTime = new Long(System.currentTimeMillis());

userMap.put(userName,currentTime);
Iterator it = userMap.entrySet().iterator();

while (it.hasNext()) {
Entry entry = (java.util.Map.Entry) it.next();
String userLogonName = (String) entry.getKey();
Long userLogonTime = (Long) entry.getValue();
System.out.println(userLogonName + "=" + userLogonTime);
}

} catch(Exception e) {
e.printStackTrace();
}
}

}
Domino0627 2009-12-30
  • 打赏
  • 举报
回复
呵呵,楼上的高手们,我的代码现在还是出问题。现在return那句出问题啊。
Domino0627 2009-12-30
  • 打赏
  • 举报
回复
呵呵,我哪里是什么IBM的,不过这个的确是在Domino里面运行的Java代理。我先试下楼上这位的方法。
sean1203 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 healer_kx 的回复:]
哇,你在写domino的代码?

[/Quote]
我也哇。。。
Dazzlingwinter 2009-12-30
  • 打赏
  • 举报
回复
用一个单例模式,就行了啊
public Class HashMapSingleton{
private static HashMapSingleton hashmapsingleton = null;
private static HashMap hashmap = new HashMap();
public static HashMapSingleton getInstance {
if(null == hashmapsingleton) {
hashmapsingleton = new HashMapSingleton();
}
return hashmapsingleton;
}
}

public class JavaAgent extends AgentBase {

private HashMap userMap = HashMapSingleton.getInstance.hashmap;

public void NotesMain() {

try {
//这里是我的业务,主要在这里向哈希表里面put值
} catch(Exception e) {
e.printStackTrace();
}
}

}

大概就这样,可以简化,没在IDE里边写
healer_kx 2009-12-30
  • 打赏
  • 举报
回复
你IBM的?
healer_kx 2009-12-30
  • 打赏
  • 举报
回复
哇,你在写domino的代码?

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧