在Java(OOP)*享多个请求的相同实例
问题描述:
我有一个类,其单个实例需要由Java中的多个类使用。我发现了两个解决方案相同: 1。通过实例方法参数 2.使用静态工厂在Java(OOP)*享多个请求的相同实例
我的问题是,如果我使用静态的工厂,我怎么能区分传入的请求时,我使用的是静态方法。我想避免第一个解决方案,因为有很多类将使用此实例。另外,如果不是上面提到的,推荐最好的设计。
代码示例:
class MyClass{
Map<String, List<String>> myMap=new ConcurrentHashMap();
public static void addToMap(String key, String value){
if(myMap.containsKey(key)){
List<String> stringList=myMap.get(key);
stringList.add(value);
}
else{
myMap.put(key,value);
}
}
}
我想在很多地方执行此add方法,而程序执行例如:
方法addEmployee():
if(employeeName==null){
MyClass.addToMap("ER101", "Name Error");
}
Method insertInDB():
catch(SQLException e){
MyClass.addToMap("SQL", "Error Occurred in DB Operation");
}
感谢
答
有很多方法可以让同一个类的实例可用于不同的调用者,例如线程或请求。
你可以做的最简单的事情之一是创建一个单例如上所示。单身人士的问题是,只有他们中的一个人,因为他们通常被设置为强制他们有一个单一的实例。
更好的是创建你的实例,并将它传递给需要它的东西。如果你正在创建一个Web应用程序或类似的东西,你可以使用SpringFramework之类的依赖注入框架来实现这一点。
在需要的地方注入实例将意味着用一个虚拟实例替换此实例以进行测试会更容易,并且在测试过程中,您将能够创建许多以不同方式配置的此类实例进行测试。
答
As 12dollar说:使用Singleton设计模式,并要求该实例的单例类:
public class ClassicSingleton {
private static ClassicSingleton instance = null;
protected ClassicSingleton() {
// Exists only to defeat instantiation.
}
public static ClassicSingleton getInstance() {
if(instance == null) {
instance = new ClassicSingleton();
}
return instance;
}
}
然后,你可以叫getInstance()
。
答
最好的设计是让你的课程成为单身人士课程。 对于您的使用情况,我认为你可以按照下面的步骤,
- 让你的构造函数为私有。
然后,在该类中有一个静态函数来返回类的实例化对象。
你可以拥有自己的if(classobj == nul)检查来验证它是否已经实例化(仅在第一次调用时它将为空,进一步调用它不会为空)并返回该对象。
干杯:)
只是做一个单身? – 12dollar
@hetalashar您的问题需要更多解释。你能发表一些示例代码来解释你的想法吗?当你说*使用静态工厂时*和*当我使用静态方法*时如何区分传入请求? – CKing
不能使用单身......有多重要求。 – codegeek