Submission: switch (...) instanceof feature
Ulf Zibis
Ulf.Zibis at gmx.de
Wed Apr 22 02:17:12 PDT 2009
Am 22.04.2009 06:55, Derek Foster schrieb:
> Like Gabriel, I have severe reservations about this proposal. I am concerned that it will encourage people to avoid the common OOP "best practice" of using virtual method dispatch in favor of doing an explicit "switch" on each subtype of a type, in cases where doing so is not necessary.
>
> I concede that there are a few (FEW!) places where doing the equivalent of a switch on instances of a type is necessary (for instance, if the type is in a library you don't have the ability to change). I can see some value in this proposal for that purpose. However, I would very much not like to see use of this construct become commonplace. I already see too many instances of people doing the equivalent of "if (object.type == FOO) {doThis(); } else if (object.type == BAR) { doThat(); }" instead of writing "object.doSomething();"
>
>
I like to provide an example where
"object.doSomething();"
doesn't work:
synchronized Charset lookup(String lowCanonical) {
// cache is initialized with available Charset classes names
Object o = cache.get(lowCanonical);
// Check cache first
if (o instanceof String) {
// Instantiate new charset
Charset cs = newCharset((String)o, lowCanonical);
// Cache it
if (cs != null)
cache.put(lowCanonical, cs);
return cs;
}
return (Charset)o;
}
This would look much nicer, as it avoids casting:
synchronized Charset lookup(String lowCanonical) {
// cache is initialized with available Charset classes names
switch (Object o = cache.get(lowCanonical) instanceof ?) {
case String :
// Instantiate new charset
Charset cs = newCharset(o, lowCanonical);
// Cache it
if (cs != null)
cache.put(lowCanonical, cs);
return cs;
case Charset :
return o;
}
}
Refer:
https://java-nio-charset-enhanced.dev.java.net/source/browse/java-nio-charset-enhanced/tags/milestone4/src/sun/nio/cs/FastCharsetProvider.java?rev=684&view=markup
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6790402
http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/001182.html
http://mail.openjdk.java.net/pipermail/coin-dev/2009-April/001328.html
- My example could also be smartly coded without switch..case statement,
if we would enhance if statement accordingly
- I also would like to have possibility to declare variables in if
clause, like it's possible in for clause:
if ((Object o = cache.get(lowCanonical)) instanceof String)
... ;
else if (o instanceof Charset)
... ;
-Ulf
> Derek
>
> -----Original Message-----
>
>> From: Gabriel Belingueres <belingueres at gmail.com>
>> Sent: Mar 30, 2009 7:31 AM
>> To: Jeroen van Maanen <jeroen at entreact.com>
>> Cc: coin-dev at openjdk.java.net
>> Subject: Re: Submission: switch (...) instanceof feature
>>
>> IMO I'm against this.
>>
>> First, it is against current best practices for the design of
>> object-oriented software to make easier to code something with a case
>> statement on types/classes.
>>
>> Second:
>> void log(Object object) {
>> switch (object) instanceof {
>> case String:
>> logger.debug("'" + object + "'");
>> case Date:
>> logger.debug(object.getTime());
>> case void:
>> logger.debug("null");
>> default:
>> logger.debug("<" + object.toString() + ">");
>> }
>> }
>>
>> It think it is clearer (when possible) writing it with several
>> overloaded methods and double dispatching.
>>
>> ....
>>
More information about the coin-dev
mailing list