gpt4 book ai didi

java - 我们可以通过java中的另一个引用创建一个引用吗?

转载 作者:行者123 更新时间:2023-11-30 10:12:23 24 4
gpt4 key购买 nike

我有 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 类中的一些函数。因此,我在 PStorageAdapter 类中创建了一个类型为 Storage 的对象并访问了它们。现在,

我想做什么?

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

我正在尝试做的事情似乎不是一种可行的方法。

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

    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 --> 存储(基类)test1Adapter, PStorageAdapter类已经继承自ClientsFactory类,JAVA不允许这样,因为它需要Multiple继承。此外,我需要将 Storage 类实现为一个接口(interface),但我不能这样做,因为该类已在代码库中定义。

此外,目标是:

  • 使用,比方说Storage类**的5个功能(假设Total func=8)**到PStorageAdapter类但是还公开其余的 8-5=3 个,稍后这 3 个功能将以某种方式 test1Adapter 类使用。
  • 上述定义的目标应该只在 session 中创建的 Storage 对象的单个副本中使用/调整。
  • PStorageAdapter 类和test1Adapter 类之间不应有任何依赖关系。例如,我将 test1Adapter 类的对象创建与存储适配器类的 execute() 方法 绑定(bind)在一起,这意味着在我执行上述方法之前,test1Adapter 将永远不会被调用。!。这不是我想要的。
  • 此外,test1AdapterPStorageAdapter 必须扩展 ClientsFactory 类的功能。

考虑到上述限制,社区中的任何人都可以提供解决此问题的方法。提前致谢。

最佳答案

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

例如,Storage定义了8个公共(public)方法:

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

最后,一些类来协调/管理 Activity (可能是单例?)

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com