如何从不同的方法访问在某种方法中创建的对象?

时间:2010-11-16 21:14:48

标签: java

我想从同一类的其他方法访问在类的某个方法中创建的对象。

public class SomeClass implements SomeInterface{

public void someMethod(int a, int b){ //Implemented method
{
 SomeOtherClass soc = new SomeOtherClass();
//some setting process
}

public int someOtherMethod(){
SomeOtherClass newSOC = soc;//Here, can i access the soc object created in "someMethod"
}
}

实际上,我想在对象中设置一些数据并从不同的方法中检索数据。那可能吗!!!

5 个答案:

答案 0 :(得分:2)

从创建它的方法返回它。或者使对象成为类的实例成员。很难说不知道背景。

ThreadLocal有一些好处(例如Spring中的请求授权信息,连接和事务),但它也可能是一个非常脏的黑客。最好通过参数明确传递信息,以便更清楚地发生了什么。

答案 1 :(得分:1)

考虑到SomeClass的对象实例用于多个请求的约束(例如,一个请求都是两个方法的调用)并且必须正确封装它们,例如在多用户系统中,您需要有一个状态对象,您可以将第一个方法的结果传输到第二个方法。

由于SomeClass的对象实例在此场景中被视为共享类,因此您需要其他内容。

两种方式:

  • 介绍一个可以从第一个方法传递到第二个方法的状态对象(例如,让第一个方法返回对象并将其作为参数传递给第二个方法)
  • 引入其他来电者无法看到的内部状态。如果您不知道自己在做什么,这可能会有风险,这在很大程度上取决于使用对象的上下文。

这两个选项都需要更改第一种方法的实现

如果您因任何原因无法更改第一种方法的实现,则问题的答案为:不,您不能使用第二种方法访问soc对象,因为第一个对象超出了范围,例如它可能已经被垃圾收集并消失了。

对于后者,您可能想要使用ThreadLocal。如果您知道某个请求(例如HTTP Servlet请求)对于用户或请求是唯一的,那么这会派上用场,因此您可以在调用第一个方法之间共享ThreadLocal中的信息/状态对象和第二种方法。如果SomeClass的对象实例被不同的线程重用,那么你需要注意正确清理!

答案 2 :(得分:0)

通过声明一个字段并将新创建的对象分配给它或将创建的对象传递给第二个方法。

分配字段:

public class SomeClass implements SomeInterface {
    private SomeOtherClass fSoc;

    public void someMethod(int a, int b) {
       fSoc = new SomeOtherClass();
       fSoc.setSomeField("w000t");
    }

    public int someOtherMethod() {
        // access here the field fSoc but keep in mind
        // that it might not have been initialized
        if (fSoc != null) {
            String someData = fSoc.getSomeField();
        }
    }
}

public class SomeOtherClass {
    private String fSomeField;

    public void setSomeField(String field) {
        fSomeField = field;
    }

    public String getSomeField() {
        return fSomeField;
    }
}

答案 3 :(得分:0)

创建一个全局对象,并使该对象引用新创建的对象,因此任何方法都可以访问它。

即。

public Object global_object;

void a(){

Object aObj = new Object();
global_object = aObj;


}


void b(){
//use global_object here.
}

答案 4 :(得分:0)

如果你想要一个类的所有方法访问一个对象,那么我会说zOObs的方法是正确的。通过在类中声明私有字段,该字段将在该类中的所有方法中可见。

这段代码是z00bs的方法,只有更多细节:

public class SomeClass implements SomeInterface {
    //Here we declare the private field, visible by all this class. It's value is null
    private SomeOtherClass fSoc;

    public void someMethod(int a, int b) {
       /*Because we declared a private field named fSoc, it can be accessed by all methods of this class.
       Here we assign it a new instance of another class. It's value is no longer null.*/
       fSoc = new SomeOtherClass();
    }

    public int someOtherMethod() {
        /*In this method access the fSoc field, that already has been initialized by someMethod().
        But as z00bs's said, keep in mind that if someMethod() wasn't already called, then fSoc isn't initialized (it's value could be null)*/
        if(fSoc != null)
            //If fSoc is not null, do something...
            String someVariable = fSoc.someMethod();
    }
}