在 Java 中与多个请求共享同一实例 (OOP)
Same instance sharing with multiple requests in Java (OOP)
我有一个class,它的单个实例需要被Java中的多个class使用。我找到了两个相同的解决方案:
1.将实例作为方法参数传递
2.使用静态工厂
我的问题是如果我使用静态工厂,当我使用静态方法时如何区分传入的请求。我想避免使用第一个解决方案,因为有许多 classes 将要使用此实例。另外,如果不是上面提到的,请推荐最好的设计。
代码示例:
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);
}
}
}
我想在程序执行时在很多地方执行这个添加方法,例如:
方法 addEmployee():
if(employeeName==null){
MyClass.addToMap("ER101", "Name Error");
}
Method insertInDB():
catch(SQLException e){
MyClass.addToMap("SQL", "Error Occurred in DB Operation");
}
谢谢
正如 12dollar 所说:使用单例设计模式,并向单例请求该实例 Class:
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()
.
有多种方法可以使 class 的同一实例可用于不同的调用者,例如线程或请求。
您可以做的最简单的事情之一就是创建一个单例,如上所示。单例的问题在于它们只能有一个,因为它们通常被设置为强制它们只有一个实例。
更好的方法是创建您的实例,并将其传递给需要它的事物。如果您正在创建 Web 应用程序或类似应用程序,则可以使用诸如 SpringFramework 之类的依赖注入框架来实现此目的。
在需要的地方注入您的实例将意味着用虚拟实例替换此实例以进行测试会更容易,并且在测试期间您将能够创建此 class 配置的许多实例不同的测试方法。
最好的设计是让您的 class 成为单例 class。
对于您的使用,我认为您可以按照以下步骤操作,
- 将您的构造函数设为私有。
然后,在 class 到 return 你的 class 的实例化对象里面有一个静态函数。
你可以有自己的 if(classobj==nul) 检查来验证它是否已经实例化(只有在第一次调用时它会是 null ,进一步调用它不会为空)和 return 对象。
干杯:)
我有一个class,它的单个实例需要被Java中的多个class使用。我找到了两个相同的解决方案: 1.将实例作为方法参数传递 2.使用静态工厂
我的问题是如果我使用静态工厂,当我使用静态方法时如何区分传入的请求。我想避免使用第一个解决方案,因为有许多 classes 将要使用此实例。另外,如果不是上面提到的,请推荐最好的设计。
代码示例:
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);
}
}
}
我想在程序执行时在很多地方执行这个添加方法,例如:
方法 addEmployee():
if(employeeName==null){
MyClass.addToMap("ER101", "Name Error");
}
Method insertInDB():
catch(SQLException e){
MyClass.addToMap("SQL", "Error Occurred in DB Operation");
}
谢谢
正如 12dollar 所说:使用单例设计模式,并向单例请求该实例 Class:
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()
.
有多种方法可以使 class 的同一实例可用于不同的调用者,例如线程或请求。
您可以做的最简单的事情之一就是创建一个单例,如上所示。单例的问题在于它们只能有一个,因为它们通常被设置为强制它们只有一个实例。
更好的方法是创建您的实例,并将其传递给需要它的事物。如果您正在创建 Web 应用程序或类似应用程序,则可以使用诸如 SpringFramework 之类的依赖注入框架来实现此目的。
在需要的地方注入您的实例将意味着用虚拟实例替换此实例以进行测试会更容易,并且在测试期间您将能够创建此 class 配置的许多实例不同的测试方法。
最好的设计是让您的 class 成为单例 class。 对于您的使用,我认为您可以按照以下步骤操作,
- 将您的构造函数设为私有。
然后,在 class 到 return 你的 class 的实例化对象里面有一个静态函数。
你可以有自己的 if(classobj==nul) 检查来验证它是否已经实例化(只有在第一次调用时它会是 null ,进一步调用它不会为空)和 return 对象。
干杯:)