我有4个课程,分别为test1Adapter
,PStorageAdapter
,Storage
和ClientsFactory
。
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(){
...}}
test1Adapter
和PStorageAdapter
必须扩展ClientsFactory
类的功能。 PStorageAdapter
类使用storage
类中的某些功能。因此,我在Storage
类中创建了一个PStorageAdapter
类型的对象,并对其进行了访问。现在,我想做的事?
我想通过
Storage
类访问test1Adapter
类中PStorageAdapter
类的方法。其背后的原因是在Storage
类型的会话中应该创建一个对象,该对象应该由其他PStorageAdapter
和test1Adapter
类进行调整/使用,否则它将创建两个对我来说毫无意义的对象。我正在尝试做的似乎不可行的方法。
我试图在
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)
。 test1Adapter
,PStorageAdapter
类已经从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
。这不是我想要的。另外,
test1Adapter
和PStorageAdapter
必须扩展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/