【问题标题】:Java: share object reference without passing as parameterJava:共享对象引用而不作为参数传递
【发布时间】:2014-01-27 19:09:18
【问题描述】:

我有一个 ObjectFactory 和一个实现该工厂的特殊案例。我无法更改具有 0 参数的接口。 在其中一种实现中,我必须读取文件并加载一些数据。要传递文件名,我可以使用系统属性,因为我只需要共享一个字符串。 但在另一种实现中,我必须不是从文件开始,而是从内存结构开始。如何将对象(然后我认为是对象引用)传递给工厂?其他方法?我无法序列化文件上的对象,并且在我再次读取它之后,因为我想要避免的是正确的 I/O 占用空间。 谢谢

好的,更多信息:

这是我必须实现的接口和抽象工厂

public abstract interface A
{
  public abstract Set<Foo> getFoo();
  public abstract Set<Bar> getBar();
}


//this is otherpackage.AFactory
public abstract class AFactory
{
    public static AccessFactory newInstance()
    {
        return a new built instance of the factory
    }

    public abstract A newA();
}

这是我的问题的实现:

public class AFactory extends otherpackage.AFactory
{
    @Override
    public Access newA()
    {
        return new AA();
    }
}


public class AA implements A
{   
    protected AA()
    {
        this.objectReferenceIWantToSaveHere = I retrieve from the shared memory zone;
        use the object
    }
}

现在我想做这样的事情:

B b = something I built before
save b in a shared memory zone or something like that
otherpackage.AFactory f = mypackage.AccessFactory.newInstance();
A a = f.newA();

在 the f.newA() 调用中我想访问 b 对象

【问题讨论】:

  • 请发布您的代码。我无法理解你的要求。您可以将引用传递给工厂构造函数。
  • 好的,添加了一个例子。你应该明白我不能简单地传递引用,因为我必须实现一个接口。
  • 您可以添加一个指定setB(B) 的接口,然后您可以在那里传递引用。或者,您可以使用Singleton。

标签: java factory


【解决方案1】:

你不能简单地使用构造函数吗?

interface ObjectFactory { Object create(); }

class SpecialFactory implements ObjectFactory {
    private final Object data;
    public SpecialFactory(Object data) { this.data = data; }
    @Override public Object create() { return somethingThatUsesData; }
}

【讨论】:

  • 不,我不能改变实现的接口,所以我不能使用构造函数。
  • @user2714602 这还不清楚 - 你可以实现一个接口并添加任何你喜欢的构造函数......
  • 看我的例子。我不能简单地实现接口并添加构造函数。这是因为要创建一个实例,我必须调用一个静态工厂方法。而且我不能改变那个原型。
  • 您要传递给新的As 的B 对象是否始终相同?还是每个A 对象都不同?
  • 第二个,运行时根据网络获取的数据创建。
【解决方案2】:

ass assylias 建议,你可以将引用传递给构造函数。或者,如果您知道在哪里可以找到参考资料,您可以在使用之前询问它?例如。 data = dataBank.giveMeTheData()

【讨论】:

    【解决方案3】:

    同意这将有助于获得更多关于您正在做的事情的上下文......但是您可以使用共享静态类,您的调用代码将信息放入静态类中,并且您的接口实现引用这个相同的静态类获取对象和/或指令?

    所以这里有一个客户端类。它有入口点..并且想将一个对象传递给接口实现者,但它不能直接传递它......所以它设置了它想要传递的对象 MyStaticHelper.SetSharedObject 方法。

    public class Client {
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String mySharedObject = "Couldbeanyobject, not just string";
    
        // Set your shared object in static class
        MyStaticHelper.SetSharedObject(mySharedObject);
    
        InterferfaceImplementer myInterfaceImplementer = new InterferfaceImplementer();
        // 
        myInterfaceImplementer.RunMyMethod();
    
    
    }
    

    这是静态助手的代码...

    public class MyStaticHelper {
    private static Object _insructionsObject;
    
    
    public static void  SetSharedObject(Object anObject)
    {
        _insructionsObject = anObject;
    }
    
    public static Object GetSharedObject()
    {
        return _insructionsObject;
    }
    

    }

    最后是你调用的类,它使用静态助手来获取相同的对象。

    public class InterferfaceImplementer {
    
    // no objects
    public void RunMyMethod()
    {
        System.out.println(MyStaticHelper.GetSharedObject());
    }
    

    }

    同样,这适用于一个非常简单的场景,如果需要同时调用多个实现者,则不会站起来,因为此解决方案只允许一个 obj 位于静态帮助器类中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 2020-02-13
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 2012-09-21
      相关资源
      最近更新 更多