4

I have below apex page which uses a custom component

<apex:page >
    <c:compo value="hello"></c:compo>
</apex:page>

Component is:

<apex:component controller="compocontroller">
    <apex:attribute name="value" type="string" description="tu" assignTo="{!valueclassvar}"/>
</apex:component>

Component Controller class is :

public class compocontroller {

    public  string valueclassvar { 
        get {
            system.debug('getmethod '+valueclassvar); 
            return valueclassvar;
        }
        set { 
            system.debug('setmethodfirst'+ valueclassvar);
            valueclassvar = value;
            system.debug('setmethod'+ valueclassvar);
        }
    }

    public compocontroller() {
        system.debug('constructor' + valueclassvar);
    }
}

When i execute the page,,and check debug log i can see

07:28:54.050 (50550965)|USER_DEBUG|[4]|DEBUG|getmethod null
07:28:54.050 (50561692)|SYSTEM_METHOD_EXIT|[4]|System.debug(ANY)
07:28:54.050 (50572663)|METHOD_EXIT|[7]|01pi0000005trqA|compocontroller.__sfdc_valueclassvar()
07:28:54.050 (50586810)|SYSTEM_METHOD_ENTRY|[7]|System.debug(ANY)
07:28:54.050 (50595306)|USER_DEBUG|[7]|DEBUG|constructornull
07:28:54.050 (50601192)|SYSTEM_METHOD_EXIT|[7]|System.debug(ANY)
07:28:54.050 (50615792)|CODE_UNIT_FINISHED|compocontroller <init>
07:28:54.050 (50775094)|CODE_UNIT_STARTED|[EXTERNAL]|compocontroller set(valueclassvar,hello)
07:28:54.050 (50784120)|SYSTEM_MODE_ENTER|true
07:28:54.050 (50800173)|CODE_UNIT_STARTED|[EXTERNAL]|compocontroller set(valueclassvar,hello)
07:28:54.050 (50884027)|SYSTEM_METHOD_ENTRY|[4]|System.debug(ANY)
07:28:54.050 (50900069)|USER_DEBUG|[4]|DEBUG|setmethodfirstnull
07:28:54.050 (50906953)|SYSTEM_METHOD_EXIT|[4]|System.debug(ANY)
07:28:54.050 (50924161)|SYSTEM_METHOD_ENTRY|[4]|System.debug(ANY)
07:28:54.050 (50931797)|USER_DEBUG|[4]|DEBUG|setmethodhello

Why is getmethod getting executed before constructor?I thought as per order of execution its the constructors that gets executed first,followed by expression/attributes of component..am i missing anything>

6

Your constructor is getting called first. Look at your constructor, it references valueclassvar. At this point, it actually calls the getter for valueclassvar, writes the system debug in the valueclassvar getter, and then returns to the constructor after which it calls System.debug in the constructor.

Furthermore, your setter will be called after the constructor is called. The setter is invoked by the assignTo attribute in your element in the component. This tends to lead to much confusion with components, and often means writing any dependent logic in your setters or elsewhere.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.