我现在有如下需求:
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();
}
}
}
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();
}
}
}
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里边写
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();
}
}
}
有问题的可能是你import少了domino的东西吧?
我把domino的去掉,执行了可以的。
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分。
晕死,这两个都要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!"); }
}