Java:共享对象引用而不作为参数传递

时间:2014-01-27 19:09:19

标签: java factory

我有一个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对象

3 个答案:

答案 0 :(得分:0)

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

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; }
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

所以这是一个客户端类。它有入口点...并且想要将一个对象传递给接口实现者,但是它不能直接传递它...所以它设置了它想要传递给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位于静态帮助器类中。