PROPOSAL: Conditional Statement

Neal Gafter neal at gafter.com
Sun Mar 29 18:54:27 PDT 2009


I don't understand the benefit over the existing if statement.

On Sun, Mar 29, 2009 at 2:41 PM, Matt Mastracci <matthew at mastracci.com> wrote:
> Conditional Statement
> =====================
>
> Richly formatted version available at:
> http://docs.google.com/Doc?id=dgthwhwr_2hs2hknhf
>
>
> AUTHOR(S): Matt Mastracci
>
> OVERVIEW
>
> FEATURE SUMMARY: Allows an analogue of the conditional expression to
> exist at the statement level, with relaxed restrictions on the type of
> its second and third operands.
>
> MAJOR ADVANTAGE: Ability to use conditional operator for choosing
> between two statement-level expressions (ie: two different method
> invocations).
>
> MAJOR BENEFIT: Simplifies code that executes one of two expression
> statements given a boolean input.
>
> MAJOR DISADVANTAGE: Turns the conditional operator into two different
> constructs in the Java language with different rules.
>
> ALTERNATIVES: Continue using if/else (this feature is sugar only).
>
> See http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.25
>  for the definition of the original conditional expression.
>
>
> EXAMPLES
>
> // even() and odd() are defined as "public void"
> public void onEvenOrOdd(int i) {
>     (i % 1 == 0) ? even() : odd();
> }
>
> // Two methods with different return types, valid
> public void oneOfTwoMethodsWithDifferentReturnTypes(boolean b) {
>     b ? methodReturningObject() : methodReturningVoid();
> }
>
>
> Examples that fail to compile:
>
> // Invalid because operands are not valid StatementExpressions
> public void invalid1() {
>     b ? 1 : 2;
> }
>
> // Invalid because third operand is not a valid StatementExpression
> public void invalid2() {
>     b ? method() : null;
> }
>
>
> DETAILS
>
> SPECIFICATION: This change requires two modifications to the Java
> Language Specification:
>
> 1.  A ConditionalStatement is added to the specification.  A
> ConditionalStatement takes a boolean expression as its first operand
> and two StatementExpressions as the second (if-true) and third (if-
> false) operands:
>
> ConditionalStatement
>    Expression ? ConditionalStatementOperand :
> ConditionalStatementOperand
>
> ConditionalStatementOperand
>    ( ConditionalStatementOperand )
>    StatementExpression
>
> There are no restrictions on the output type of the
> StatementExpression.  Any valid statement expression today is valid as
> an operand of the conditional statement.
>
> The conditional statement is right-associative like the conditional
> expression.
>
>
> 2.  The definition of StatementExpression is changed to allow the
> conditional operator statement as one of its alternatives (this might
> be better to add to the StatementWithoutTrailingSubstatement block
> instead):
>
>  StatementExpression:
>          Assignment
>          PreIncrementExpression
>          PreDecrementExpression
>          PostIncrementExpression
>          PostDecrementExpression
>          MethodInvocation
>          ClassInstanceCreationExpression
> +        ConditionalStatement
>
> COMPILATION: The ConditionalStatement may always be desugared to a
> standard if/else construct:
>
> boolean-expression ? statement-expression-1 : statement-expression-2
>
> desugars to:
>
> if (boolean-expression)
>   statement-expression-1;
> else
>   statement-expression-2;
>
>
> TESTING: Add a conditional statement to the files tested during
> complation.  Test that a conditional statement fails to compile when
> operands are not valid StatementExpressions.
>
> LIBRARY SUPPORT: None.
>
> REFLECTIVE APIS: No changes.
>
> OTHER CHANGES: No changes.
>
> MIGRATION:
>
> An IDE may offer to automatically simplify if/else constructs with two
> expression statements:
>
> if (condition) {
>      expression-statement-1;
> } else {
>      expression-statement-2;
> }
>
> to:
>
> condition ? expression-statement-1 : expression-statement-2;
>
>
> COMPATIBILITY
>
> BREAKING CHANGES: None
> EXISTING PROGRAMS: No issues.
>
>
> REFERENCES
>
> EXISTING BUGS: None found.
>
>
>
>



More information about the coin-dev mailing list