通过将其作为参数发送到另一个非静态方法来声明类的字段是主要问题。在一种方法中,我将类的字段作为参数发送到另一个方法来检查它并将其分配给新实例。但是,它似乎不是通过引用调用,而是通过call-by-value调用它。我该如何解决?
class Foo{
private volatile static Set field;
void bar(){
loadSet(Foo.field);
.... <------ at that line after loadSet field is null
}
void loadSet(Set instance){
if(instance == null){
instance = Operation.getInstance(); // <--- getInstance returns new instance
}
}
}
由于性能问题,我不希望loadSet和bar方法是静态的,即不违反纯并行化。
我知道addAll方法Set但是在我的实际代码中,我使用的是第三方库,它返回一个实例类型IPos。此外,IPos没有clone,copy或addAll方法。为简单起见,我使用了Set。
答案 0 :(得分:0)
您无法传递对该字段的引用。您只能传递对该字段中存储的对象的引用。在null
案例中,它并不指向任何事物。我可以在不改变你的方法的情况下建议的最好的是
class Foo{
private volatile static Set field;
void bar(){
Foo.field = loadSet(Foo.field);
.... <------ at that line after loadSet field is null
}
Set loadSet(Set instance){
if(instance == null){
return Operation.getInstance(); // <--- getInstance returns new instance
}
return instance;
}
}
答案 1 :(得分:0)
更好更清洁的方法是封装“&#39;字段”。字段。
class Foo{
private static Set field;
private static Set field() { // <- may need to change to protected or public of default visibility depending on your use case
if (field == null) {
// Double-checked locking works perfectly, no need to mark 'field' volatile.
synchronized(Foo.class) {
if (field == null) {
field = Operation.getInstance();
}
}
}
return field;
}
void bar(){
// use Foo.field() everywhere instead of Foo.field;
}
}