[ 
https://issues.apache.org/jira/browse/WICKET-3392?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Igor Vaynberg resolved WICKET-3392.
-----------------------------------

    Resolution: Duplicate
      Assignee: Igor Vaynberg

i have answered your comments in 3128

> Page#onInitialize (and prepareForRender) is now broken as it is final (see 
> Wicket-3218)
> ---------------------------------------------------------------------------------------
>
>                 Key: WICKET-3392
>                 URL: https://issues.apache.org/jira/browse/WICKET-3392
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket
>    Affects Versions: 1.5-RC1
>            Reporter: Szádeczky-Kardoss Szabolcs
>            Assignee: Igor Vaynberg
>            Priority: Critical
>   Original Estimate: 2h
>  Remaining Estimate: 2h
>
> I think the 3218 issue is really a misunderstanding of the onInitialize 
> concept, as it was a really needed feature. This was the reason I switched to 
> 1.5-M3, and then BANG! in RC1 this is broken. Let me explain how to use it in 
> the right way, and then my use case for which this is much needed. 
> USAGE 
> As you have pointed out, onInitialize gets called at the first time when a 
> component gets added to the Page, or - if this doesn't happen in the 
> constructor then - in the render phase (internalPrepareForRender method) at 
> latest. Well, if you add any component to the page in the constructor then 
> onInitialize is really not of much use, actually in this case it's better not 
> to use it all. However if you start making pages as I do, then it becomes a 
> joy to work with. 
> The solution is simple: Don't add any component to the Page in the 
> constructor, use onInitialize for that purpose. If you advocate this as a 
> best practice then the use cases stated below will be much easier to make 
> than without the onInitialize (and using only constructor). 
> The constructor is anyway best suited only for setting up models, performing 
> (some or all of the) service calls and other things needed to ensure that the 
> given Page is the one to show to the user, without going into costly 
> component additions to the Page. 
> USE CASES 
> - In my current project we have a common base page from which all other pages 
> subclasses and so we share a common layout, some common panels and common 
> functionality in all pages. However once in a while it might be needed to 
> hide or replace one of the common panels in only one page but leave it as 
> common in all of the others. If you only could do this in the constructor 
> then that will be a really pain. The reason in short is that irrespective of 
> whether you use overriden "panel adder methods" or any other solution you are 
> still in object construction phase and that puts quite a few restrictions on 
> variable initialization order. I know, I did it, and there are only hacking 
> workarounds for this. On the other hand, onInitialize is a super elegant way 
> to use overriden methods or any cool OO technique since you are not 
> constrained any more by the "Construction phase". 
> - An other use case is that the user is doing stuff on any page, it can be 
> anything. Irrespective of what he/she is doing, something is happening in the 
> background, perhaps by an other user's action. The next time the first user 
> is refreshing this page or going to another page, I want the user to be 
> notified, in a common way, in a common code. This can be also achieved 
> without onInitialize with more or less hacking (especially when we want the 
> user notified when staying on the same page), but with onInitialize this is a 
> much cleaner. The reason is that prepareForRender (which by the way also got 
> final, why?) precedes onInitialize and so it is possible to do this check 
> there. 
> FINAL/NON-FINAL :) THOUGHTS 
> Sorry for getting so long, my only point is that onInitialize (and 
> prepareForRender) not being final was one of the great achievements of 1.5 
> (backported into 1.4, or was it the other way around?). There were really use 
> cases for this, especially the avoidance of the Java Object Construction 
> Phase limitations (and the possibility of not having ugly big constructors 
> :)). Sure this can be misused or used wrongly as a lot of other things in 
> Wicket, but this is not a reason to limit the good usage of this. You can put 
> it in the javadoc, that only use onInitialize when you don't do add 
> operations in the constructor. Actually I would also ask what's the point of 
> onInitialize anywhere else than for Pages? At least I could live without it 
> anywhere else, but not for Pages. 
> I hope you will change both methods back to non-final. If not, then I will 
> have to revert to 1.4 and possibly never use 1.5 since the above issues are 
> showstoppers for me. This would be a sad thing from such a great framework.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to