Java 包装不可编辑的单例类
我有Java 包装不可编辑的单例类,java,design-patterns,singleton,Java,Design Patterns,Singleton,我有SingletonA和SingletonB,在一个模糊文件中的类。它们并没有实现相同的接口,也不是同一超类的子类,但它们确实具有类似的特性,而这正是最初的程序员所忽略的 我希望能够将它们作为参数传递给如下方法: public void method(SingletonObject singleton) { //do stuff with singleton } 然而,我能想到的唯一可行的办法是: public void method(Object singleton) {
SingletonA
和SingletonB
,在一个模糊文件中的类。它们并没有实现相同的接口,也不是同一超类的子类,但它们确实具有类似的特性,而这正是最初的程序员所忽略的
我希望能够将它们作为参数传递给如下方法:
public void method(SingletonObject singleton) {
//do stuff with singleton
}
然而,我能想到的唯一可行的办法是:
public void method(Object singleton) {
if(singleton instanceof SingletonA) {
SingletonA singletonA = (SingletonA) singleton;
// do stuff with singletonA
}
else if(singleton instanceof SingletonB) {
SingletonB singletonB = (SingletonB) singleton;
//do exact same stuff with singletonB
}
else {
return;
}
}
既然下面的例子很糟糕,我该怎么做才能让它看起来更像上面的 如果您知道这两个不同的类存在某种方法,那么您可以使用反射
public void method(Object singleton) {
Class<?> clazz = singleton.getClass();
Method m;
try {
m = clazz.getDeclaredMethod("someCommonMethod");
//m.setAccessible(true);
m.invoke(singleton);
} catch (Exception e) {
e.printStackTrace();
}
}
public void方法(对象单例){
类clazz=singleton.getClass();
方法m;
试一试{
m=clazz.getDeclaredMethod(“someCommonMethod”);
//m、 setAccessible(true);
m、 调用(单例);
}捕获(例外e){
e、 printStackTrace();
}
}
合成也可以是一种选择:
class SingletonObject{
SingletonA a;
SingletonB b;
SingletonObject(SingletonA a, SingletonB b){
if(a==null && b==null){
throw InvalidArgumentException();
}
this.a = a;
this.b =b
}
public void callCommonMethod(){
if(a!=null){
a.callCommonMethod();
}else{
b.callCommonMethod()
}
}
}
因此,您将单例对象组合到一个类中,任何人都可以使用它,而不知道它们背后是什么如果单例很小,用例很多,那么您可以创建一个外部具有共享属性的包装器,但在幕后可以决定它包装的单例类型。但是如果单例比较大,用例比较少,那么您当前的方法就更好了,而且反射节省了时间。谢谢