Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 包装不可编辑的单例类_Java_Design Patterns_Singleton - Fatal编程技术网

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()
         }
    }
}

因此,您将单例对象组合到一个类中,任何人都可以使用它,而不知道它们背后是什么

如果单例很小,用例很多,那么您可以创建一个外部具有共享属性的包装器,但在幕后可以决定它包装的单例类型。但是如果单例比较大,用例比较少,那么您当前的方法就更好了,而且反射节省了时间。谢谢