2010-12-13 10 views
0

Mit anonymen inneren Klassen behandelt Java Felder, die außerhalb des anonymen inneren Klassenblocks deklariert sind.Anonyme innere Klasse und Felder außerhalb dieses Codeblocks

Im Fall policyOwnerModelObject, wie ist dieses Feld in der generierten anonymen inneren Klasse definiert?

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

====

OK, dekompilierten die Klasse und das ist, was ich habe:

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

Ich verstehe diese Zeile nicht: 'this $ 0 = final_policytrustpanel;' Woher kommt 'final_policytrustpanel'? – jjnguy

+0

Denken Sie an das äußere "dieses" als ein "endgültiges" Local der umschließenden Methode (auch wenn die innere Klasse nicht anonym ist). –

+0

Ich dekompilierte die ABC $ 1.class-Datei. Der Decompiler hat die final_policy-Vertrauensstellung nicht übernommen. Ich weiß nicht, was das ist. Aber ich habe meine Antwort bekommen. –

Antwort

1

Hier private Bean policyOwnerModelObject ist nur ein reguläres Mitglied der Klasse. Die Variable muss in diesem Fall nicht endgültig sein, da sie niemals außerhalb des Gültigkeitsbereichs liegt, bevor die anonyme Klasse dies tut. Die innere Klasse hat vollen Zugriff auf die Variable, als wäre sie ein Mitglied dieser inneren Klasse.

Im Allgemeinen (anonyme oder nicht) innere Klassen haben vollen Zugriff auf Member-Variablen ihrer übergeordneten Klassen.

+0

Siehe oben, ich habe die anonyme innere Klasse dekompiliert. Interessant. –

Verwandte Themen