Анонимный внутренний класс и поля вне этого блока кода - PullRequest
0 голосов
/ 13 декабря 2010

В случае анонимных внутренних классов как Java обрабатывает поля, объявленные вне блока анонимного внутреннего класса.

В случае policyOwnerModelObject как это поле определяется в созданном анонимном внутреннем классе?

// Local variable
final Bean policyOwnerModelObject = XXXXX <--- here, how is the class built with access to this object.  Is it a final field in the class?

    final WebMarkupContainer container = new WebMarkupContainer("container") {            
            @Override
            public boolean isVisible() {                
                if ((policyOwnerModelObject.getPolicyOwner() != null) && (policyOwnerModelObject.getPolicyOwner().getValue() != null)) {
                    return !PolicyOwnerService.TRUST.equals(policyOwnerModelObject.getPolicyOwner().getValue());
                } else {
                    return false;
                }
            } 
        }; 

====

ОК, декомпилировал класс и вот что я получил:

class MyDataPanel$1 extends WebMarkupContainer
{

    public boolean isVisible()
    {
        if(val$policyOwnerModelObject.getMy() != null && val$policyOwnerModelObject.getMy().getValue() != null)
            return !"4".equals(val$policyOwnerModelObject.getMy().getValue());
        else
            return false;
    }

    final MyDataPanel this$0;
    private final MyBean val$policyOwnerModelObject;

    MyDataPanel$1(MyBean policyownerbean)
    {
        this$0 = final_policytrustpanel;
        val$policyOwnerModelObject = policyownerbean;
        super(String.this);
    }
}

1 Ответ

1 голос
/ 13 декабря 2010

Здесь private Bean policyOwnerModelObject - обычный член класса. В этом случае переменная не должна быть конечной, потому что она никогда не выйдет из области видимости, прежде чем анонимный класс сделает это. Внутренний класс будет иметь полный доступ к переменной, как если бы он был членом этого внутреннего класса.

Как правило (анонимные или нет) внутренние классы имеют полный доступ к переменным-членам своих родительских классов.

...