我想从同一类的其他方法访问在类的某个方法中创建的对象。
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"
}
}
实际上,我想在对象中设置一些数据并从不同的方法中检索数据。那可能吗!!!
答案 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();
}
}