Submission: switch (...) instanceof feature
Neal Gafter
neal at gafter.com
Mon May 4 07:01:07 PDT 2009
If we want a variable inside the switch statement with a different type than
outside, then the programmer should introduce a new variable. That allows
the new form of the switch statement to be used with general expressions
instead of only a simply-named variable. Something like this:
switch instanceof (expression) {
case (String s):
// code for when the expression is of type String, using variable s
case (Integer i):
// etc
}
There would have to be either an implicit 'break' between the cases, or the
'break' would be required.
Regards,
Neal
On Mon, May 4, 2009 at 1:58 AM, Jeroen van Maanen <jeroen at lexau.org> wrote:
> A colleague of mine pointed out that "if (... instanceof ...)" is currently
> syntactically correct code. Suddenly the "if" statement would show kind of a
> meta side effect for a highly specific subset of tests. He suggested that
> the new "type narrowing if" would get a clearly distinguished syntax, for
> example:
>
> a concise syntax similar to the extended "for" statement:
>
> if (name : Type) { ... }
>
> or verbose:
>
> if instanceof (name : Type) { ... }
>
> or like a declaration rather that a test, which clearly emphasizes the side
> effect:
>
> if instanceof (Type name) { ... }
>
> Jeroen
>
> Jeroen van Maanen schreef:
>
> I agree that "if (... instanceof ...)" is more readable than the extension
>> of "switch" that I proposed originally. I believe that this feature that
>> avoids an unnecessary new name and cast would be of great benefit to the
>> Java language.
>>
>> Jeroen
>>
>> Derek Foster schreef:
>>
>>> I notice that the example you gave is actually an argument for an "if"
>>> that respects instanceOf, rather than a 'switch' that does. It seems to me
>>> like an abuse of notation to use a 'switch' in a case like this where only
>>> one decision (it is or it isn't a subtype of a given type) is being made.
>>>
>>> Although I am skeptical of the 'switch instanceof' feature, for the
>>> reasons I outlined below, I would very much like to see Java implement the
>>> 'if instanceof' feature that is implied in the proposal, and which various
>>> people have been suggesting, so that this very common coding pattern:
>>>
>>> if (foo instanceof Bar) {
>>> Bar bar = (Bar)foo;
>>> doSomethingWith(bar);
>>> }
>>>
>>> could be simplified to:
>>>
>>> if (foo instanceof Bar) {
>>> doSomethingWith(foo);
>>> }
>>>
>>> with no loss of type safety. It seems to me that your example would be
>>> more readable with such a construct than it is with the 'switch instanceof'
>>> feature.
>>>
>>> I had intended to submit a proposal along these lines myself, but simply
>>> ran out of time to put it together. Still, it seems to me that there's been
>>> widespread agreement on the list that the 'if instanceof' sub-proposal is a
>>> good idea.
>>>
>>> Derek
>>>
>>>
>>>
>>>
>>>
>>> -----Original Message-----
>>>
>>>> From: Ulf Zibis <Ulf.Zibis at gmx.de>
>>>> Sent: Apr 22, 2009 5:17 AM
>>>> To: Derek Foster <vapor1 at teleport.com>
>>>> Cc: Gabriel Belingueres <belingueres at gmail.com>, Jeroen van Maanen <
>>>> jeroen at entreact.com>, coin-dev at openjdk.java.net
>>>> Subject: Re: Submission: switch (...) instanceof feature
>>>>
>>>> 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