2014-08-14 7 views
0

Объявление класса класса путем отправки его как параметра нестационарного метода в другой. Основная проблема. В одном методе я отправляю поле класса как параметр в другое, чтобы проверить его и назначить ему в новый экземпляр. Но, вместо вызова по ссылке, он вызывает его по вызову. Как я могу это исправить?Назначить поле класса другим способом

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 и барные методы статичными из-за проблемы с производительностью, то есть не нарушающие чистое распараллеливания.

Я знаю, что метод addAll, но в моем реальном коде я использую стороннюю библиотеку и возвращает IPos типа экземпляра. Кроме того, у IPos нет метода клонирования, копирования или addAll. Я использовал Set для простоты.

ответ

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

Лучшим и понятным подходом было бы инкапсулировать поле «поле».

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; 
    } 
    } 
Смежные вопросы