我有4个课程,分别为test1AdapterPStorageAdapterStorageClientsFactory

test1Adapter类

public class test1Adapter extends ClientsFactory {

    public Storage TestRefToSharedStorage;
    public  test1Adapter(Storage SharedStorage) {

    this.TestRefToSharedStorage=SharedStorage;
}
    public void execute(int clientID, String text) {

        tempBuffer = new byte[TestRefToSharedStorage.pageSize];

                long firstPageNumber  = TestRefToSharedStorage.AllocatePage();
                TestRefToSharedStorage.WritePage( firstPageNumber , tempBuffer );
                TestRefToSharedStorage.ReadPage(firstPageNumber, tempBuffer );
                TestRefToSharedStorage.DeAllocatePage(firstPageNumber);
}}


PStorageAdapter

public class PStorageAdapter extends ClientsFactory {

    public int pageSize;

    //  create storage.
    Storage MyStorage = new Storage();

    public void execute(int clientID, String text) {

                MyStorage.LoadStorage(filename);
                MyStorage.UnloadStorage();
        }
    }
}


存储

public class Storage{
private String fileName;
private long fileSize;
public RandomAccessFile file;
public int pageSize;
private int bitMapSize;

public void CreateStorage(String fileName,int pageSize, int fileSize) throws Exception{
...
}
public void LoadStorage(String fileName) throws Exception{
...
}
public void ReadPage(long n, byte [] buffer) throws Exception{
...
}
public void WritePage(long n, byte[] buffer) throws Exception{
...
}
public long AllocatePage() throws Exception{
...
}
public void DeAllocatePage(long n) throws Exception{
...
}
public void printStats(){
...}}


test1AdapterPStorageAdapter必须扩展ClientsFactory类的功能。 PStorageAdapter类使用storage类中的某些功能。因此,我在Storage类中创建了一个PStorageAdapter类型的对象,并对其进行了访问。现在,

我想做的事?


我想通过Storage类访问test1Adapter类中PStorageAdapter类的方法。其背后的原因是在Storage类型的会话中应该创建一个对象,该对象应该由其他PStorageAdaptertest1Adapter类进行调整/使用,否则它将创建两个对我来说毫无意义的对象。


我正在尝试做的似乎不可行的方法。


我试图在test1Adapter类中创建一个PStorageAdapter类型的对象,并在其构造函数中传递了Storage对象。稍后,我在Storage类中创建了一个test1Adapter类型的引用变量,该变量将指向在Storage的构造函数中传递的上述test1Adapter对象。如下所示

import cyclients.PStorage.Storage;
import cyclients.Test1.test1Adapter;
public class PStorageAdapter extends ClientsFactory {

//  create storage.
Storage MyStorage = new Storage();

public void execute(int clientID, String text) {

    MyStorage.CreateStorage(filename, pageSize, fileSize);

    if (MyStorage != null) {
        test1Adapter testing = new test1Adapter(MyStorage);
    }
}}


这导致运行时错误(编辑)

java.lang.InstantiationException: cyclients.Test1.test1Adapter
at java.lang.Class.newInstance(Unknown Source)

另一种方法是在3级实现继承。 test1Adapter---> PStorageAdapter --> Storage(base class)test1AdapterPStorageAdapter类已经从ClientsFactory类继承,然后JAVA不允许这样做,因为它需要Multiple Inheritance。而且,我需要将Storage类实现为我不能做的接口,因为该类已经在代码库中定义了。


此外,目标是:


使用,假设Storage类的5个功能**(假设总功能= 8)**进入PStorageAdapter类,但其余的8-5 = 3个也要暴露,稍后这3个功能将由test1Adapter类以某种方式。
上述目标仅应在会话中创建的Storage对象的单个副本中使用/调整。
PStorageAdapter类和test1Adapter类之间不应有任何依赖关系。例如,我将test1Adapter类的对象创建与execute() method of storage adapter class绑定在一起,这意味着在执行上述方法之前,将永远不会调用test1Adapter。这不是我想要的。
另外,test1AdapterPStorageAdapter必须扩展ClientsFactory类的功能。


保持上述矛盾,社区中的任何人都可以提供解决此问题的方法。提前致谢。

最佳答案

这听起来像是将依赖项注入与适配器模式一起使用的组合。依赖项注入确保不同的对象在同一个Storage实例上工作,并且适配器限制了Storage方法的公开范围。您在帖子中未描述的部分将类似于SessionManager类,以协调工作。

例如,Storage定义8个公共方法:

public class Storage {
    public void method1(){}
    public void method2(){}
    public void method3(){}
    public void method4(){}
    public void method5(){}
    public void method6(){}
    public void method7(){}
    public void method8(){}
}


但是PStorage包装了一个Storage以仅公开方法1到5:

public class PStorage {
    private final Storage storage;

    public PStorage(Storage storage) {
       this.storage = storage;
    }

    public void method1(){storage.method1();}
    public void method2(){storage.method2();}
    public void method3(){storage.method3();}
    public void method4(){storage.method4();}
    public void method5(){storage.method5();}
}


TestStorage包装一个Storage以仅公开方法6至8:

public class TestStorage {
    private final Storage storage;

    public PStorage(Storage storage) {
       this.storage = storage;
    }

    public void method6(){storage.method6();}
    public void method7(){storage.method7();}
    public void method8(){storage.method8();}
}


因此,PStorageAdapter(这是一个好名字吗?)在PStorage实例上起作用:

public class PStorageAdapter extends ClientsFactory {
    private final PStorage storage;

    public PStorageAdapter(PStorage storage) {
        this.storage = storage;
   }

    public execute(...) {
        // can only call storage.method1() through storage.method5()
    }
}


TestStorageAdapter(这是一个好名字吗?)可用于TestStorage实例:

public class TestStorageAdapter extends ClientsFactory {
    private final TestStorage storage;

    public TestStorageAdapter(TestStorage storage) {
        this.storage = storage;
   }

    public execute(...) {
        // can only call storage.method6() through storage.method8()
    }
}


最后,是一些用于协调/管理活动的类(可能是Singleton?)

public class SessionManager {
    Map<String, Storage> sessions = new ...;

   public getPStorageAdapterFor(String sessionId)  {
       return new PStorageAdapter(new PStorage(getStorage(sessionId)));
   }

   public getTestStorageAdapterFor(String sessionId)  {
       return new TestStorageAdapter(new TestStorage(getStorage(sessionId)));
   }

   private Storage getStorageFor(String sessionId)  {
       Storage storage = sessions.get(sessionId);
       if (storage == null) {
          storage = new Storage();
          sessions.put(sessionId, storage);
       }

       return storage;
   }


}

关于java - 我们可以通过Java中的另一个引用创建引用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51898939/

10-09 01:27