We don't use event objects in Pivot - we pass the event information directly to the event handler method as arguments (it saves the heap allocation and makes the listener easier to understand). So the method is already consistent with Pivot conventions.

I will make sure the Javadoc for the Application class is clear. Thanks for your feedback.


On Jun 24, 2009, at 9:23 AM, Christopher Brind wrote:

In that case you should pass in an event object and do something with the
event:

public void shutdown(ShutdownEvent event) {

  if (someReasonToNotShutdown()) {
     // don't want to shutdown...
     event.cancel();
  }

}

But then that becomes overly verbose, IMHO. I like the conciseness of the current design and wouldn't actually advocate creating an Event object just
for this.

So long as it is well documented in the Javadocs, it should be fine whatever
the final decision.

Cheers,
Chris


2009/6/24 Greg Brown <[email protected]>

It's more along the lines of consuming an event. "shutdown()" is a
notification. Returning true means that you rejected the notification (like
consuming an event).


On Jun 24, 2009, at 9:13 AM, Christopher Brind wrote:

I'm not sure I agree... by calling shutdown, which returns a boolean,
you're
asking the question 'should the app shutdown?'

shutdown ? yes : no

Thus logically, you wouldn't answer "no" to the question "shutdown?" if
you
wanted to actually shutdown.

Cheers,
Chris


2009/6/24 Greg Brown <[email protected]>

The enums are potentially just as confusing. Does continue mean "continue
execution" or "continue shutdown"?

The shutdown() method is only meant to be invoked by the application context. Maybe it should be protected so that only subclasses and the org.apache.pivot.wtk package could see it. However, Application is an
interface so that's not possible.

The conversation between the application context and the application
might
go like this:

App context: "It is time to shut down. You can say no if you want." ->
shutdown(true)
Application: "I don't want to shut down right now."  -> return true
(cancels shutdown)

or this:

App context: "It is time to shut down. You have no choice."  ->
shutdown(false)
Application: "OK." -> return false (value doesn't matter since shutdown
is
not optional)

I don't think there's anything terribly confusing about either of these
scenarios, or the return values.



On Jun 24, 2009, at 8:56 AM, Christopher Brind wrote:

Generally you should avoid double negative testing which I think is what

would happen here...

*Scenario 1:*
boolean shouldShutdown = shutdown();

if (shouldShutdown) {
System.exit(0);
}


*Scenario 2:*
boolean dontShutdown = shutdown();

if (!dontShutdown) { // double negative
System.exit(0)
}


I think Scenario 1 is easier to understand.



Alternatively why not return an enum?

public enum ShutdownResponse { CONTINUE, ABORT };

And change the signature to:

public ShutdownResponse shutdown();


Cheers,
Chris



2009/6/24 Greg Brown <[email protected]>

Most of the time my applications don't have any shutdown logic. So the


shutdown() method is already a corner case.


Actually, most of our sample applications do. They close the main
window,
perform service logout, etc.

there are going to be times when the program does not have a

choice about shutting down (e.g. System Update forced a reboot).
Thus we need to separate the "can shutdown" flag from the "shutting
down
now" action.


That's why shutdown() takes a boolean "optional" argument. If
optional is
true, the method can return a value indicating whether it would like to cancel shutdown. If false (e.g. during reboot), the return value will
be
ignored.

I think the method signatures as currently defined are OK. They
parallel
(somewhat) the applet lifecycle methods. My question to you all was -
should
the return value of shutdown() mean "approve" or "deny"? It is
currently
defined as "approve", but I'm leaning towards changing it to the
latter.









Reply via email to