Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Difference between revisions of "Java16/Examples"
(Created page with "This is an informal page listing examples of features that are implemented by the Java 16 Support, which can be installed from the [https://marketplace.eclipse.org/content/jav...") |
|||
(9 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | This is an informal page listing examples of features that are implemented by the Java 16 Support, which can be installed from the [https://marketplace.eclipse.org/content/java- | + | This is an informal page listing examples of features that are implemented by the Java 16 Support, which can be installed from the [https://marketplace.eclipse.org/content/java-16-support-eclipse-2021-03-419 Marketplace]. You are welcome to try out these examples. If you find bugs, please file a bug after checking for a duplicate entry [https://bit.ly/2PS89Kt here] |
Watch out for additional examples being added soon. | Watch out for additional examples being added soon. | ||
<b>NOTE:</b> | <b>NOTE:</b> | ||
− | * | + | * Records is <b>standard features</b> in Java 16. |
− | * | + | * Instanceof Pattern Matching is also another <b>standard features</b> in Java 16. |
− | * | + | * Sealed Classes is another preview feature in Java 16. They are not enabled by default and can by enabled using <b>--enable-preview</b>. |
* In Eclipse, <b>--enable-preview</b> can be enabled from the Preferences. It is implicitly added while launching a java program if the feature has been enabled for the project/workspace. | * In Eclipse, <b>--enable-preview</b> can be enabled from the Preferences. It is implicitly added while launching a java program if the feature has been enabled for the project/workspace. | ||
Line 23: | Line 23: | ||
|Specifying the JVM in eclipse.ini | |Specifying the JVM in eclipse.ini | ||
|- | |- | ||
− | ! colspan="3" | | + | ! colspan="3" | Preview Feature: Sealed Classes |
|- | |- | ||
− | ! scope="row" | | + | ! scope="row" | Postive compilation1 (Sealed Class Example) |
− | | | + | | Use the following code: |
<source lang="java"> | <source lang="java"> | ||
− | + | @SuppressWarnings("preview") | |
+ | sealed class Y permits X { | ||
+ | } | ||
+ | |||
+ | @SuppressWarnings("preview") | ||
+ | non-sealed class X extends Y { | ||
public static void main(String[] args) { | public static void main(String[] args) { | ||
− | + | System.out.println(0); | |
− | + | ||
− | + | ||
− | + | ||
− | System.out.println( | + | |
} | } | ||
+ | }</source> | ||
+ | |||
+ | <br> | ||
+ | <br> | ||
+ | [[File:Sealed-class1.png]] | ||
+ | |Code compiles and prints 0. | ||
+ | |- | ||
+ | ! scope="row" | Postive compilation2 (Sealed Class Example) | ||
+ | | Use the following code: | ||
+ | <source lang="java"> | ||
+ | @SuppressWarnings("preview") | ||
+ | sealed interface I extends SI { | ||
} | } | ||
− | </source> | + | |
+ | @SuppressWarnings("preview") | ||
+ | non-sealed class X implements SI { | ||
+ | public static void main(String[] args) { | ||
+ | System.out.println(0); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | @SuppressWarnings("preview") | ||
+ | sealed interface SI permits X,I { | ||
+ | } | ||
+ | |||
+ | @SuppressWarnings("preview") | ||
+ | non-sealed interface I2 extends I { | ||
+ | }</source> | ||
<br> | <br> | ||
<br> | <br> | ||
− | [[File: | + | [[File:Sealed-class2.png]] |
− | | Code compiles and prints | + | |Code compiles and prints 0. |
|- | |- | ||
− | ! scope="row" | | + | ! scope="row" | Postive compilation3 (Sealed Class Example) |
| Use the following code: | | Use the following code: | ||
<source lang="java"> | <source lang="java"> | ||
− | + | @SuppressWarnings("preview") | |
+ | sealed class X permits Y { | ||
public static void main(String[] args) { | public static void main(String[] args) { | ||
− | + | System.out.println(100); | |
− | + | ||
− | + | ||
− | + | ||
} | } | ||
+ | } | ||
+ | |||
+ | @SuppressWarnings("preview") | ||
+ | non-sealed class Y extends X { | ||
}</source> | }</source> | ||
<br> | <br> | ||
<br> | <br> | ||
− | [[File: | + | [[File:Sealed-class3.png]] |
− | | | + | |Code compiles and prints 100. |
|- | |- | ||
+ | ! scope="row" | Postive compilation4 (Sealed Class Example) | ||
+ | | Use the following code: | ||
+ | <source lang="java"> | ||
+ | @SuppressWarnings("preview") | ||
+ | sealed public class X<T> { | ||
+ | public static void main(String[] args) { | ||
+ | System.out.println(100); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | @SuppressWarnings({ "preview", "rawtypes" }) | ||
+ | non-sealed class Y extends X { | ||
+ | }</source> | ||
+ | |||
+ | <br> | ||
+ | <br> | ||
+ | [[File:Sealed-class4.png]] | ||
+ | |Code compiles and prints 100. | ||
|- | |- | ||
− | ! colspan="3" | | + | ! scope="row" | Negative compilation1 (Sealed Class Example) |
+ | | Use the following code: | ||
+ | <source lang="java"> | ||
+ | @SuppressWarnings("preview") | ||
+ | sealed public sealed class X { | ||
+ | public static void main(String[] args) { | ||
+ | System.out.println(100); | ||
+ | } | ||
+ | }</source> | ||
+ | |||
+ | <br> | ||
+ | <br> | ||
+ | [[File:Sealed-class5_BetaJava16.png]] | ||
+ | |Code fails to compile with error "Multiple markers at this line | ||
+ | - Sealed class lacks the permits clause and no top level or nested class from the same compilation unit declares X as its direct superclass | ||
+ | |||
+ | - Duplicate modifier for the type X" | ||
+ | |- | ||
+ | ! scope="row" | Syntax coloring for “sealed”, “non-sealed”, “permits” | ||
+ | | | ||
+ | [[File:Syntax-coloring.png]] | ||
+ | |New restricted keywords are colored | ||
+ | |- | ||
+ | ! scope="row" | Quick fixes support to add sealed/final/non-sealed modifier on a permitted class declaration. | ||
+ | | | ||
+ | [[File:Quick-fixes-3.png]] | ||
+ | |Three quick fix modifier options: | ||
+ | - sealed | ||
+ | |||
+ | - non-sealed | ||
+ | |||
+ | - final | ||
+ | |- | ||
+ | ! scope="row" | Quick fixes support to add sealed/non-sealed modifier on a permitted interface declaration. | ||
+ | | | ||
+ | [[File:Quick-fixes-2.png]] | ||
+ | |Two quick fix modifier options: | ||
+ | - sealed | ||
+ | |||
+ | - non-sealed | ||
+ | |- | ||
+ | ! scope="row" | "Match locations" dialog supports "Permitted type declarations" | ||
+ | | | ||
+ | [[File:Permitted-Type-Declarations.png]] | ||
+ | |"Search > Java Search > Match locations" dialog supports "Permitted type declarations" check-box option. | ||
+ | |- | ||
+ | ! colspan="3" | Standard Feature: Records | ||
|- | |- | ||
! scope="row" | Postive compilation1 (Record Example) | ! scope="row" | Postive compilation1 (Record Example) | ||
| Compile and run the following code: | | Compile and run the following code: | ||
<source lang="java"> | <source lang="java"> | ||
− | |||
record Point(int x, int y) { | record Point(int x, int y) { | ||
} | } | ||
Line 86: | Line 178: | ||
System.out.println(0); | System.out.println(0); | ||
} | } | ||
− | |||
record Point(int x, int y) { | record Point(int x, int y) { | ||
} | } | ||
Line 101: | Line 192: | ||
} | } | ||
} | } | ||
− | |||
final record Point(int x, int y) { | final record Point(int x, int y) { | ||
} | } | ||
Line 110: | Line 200: | ||
| Compile and run the following code: | | Compile and run the following code: | ||
<source lang="java"> | <source lang="java"> | ||
− | |||
record R() { | record R() { | ||
} | } | ||
Line 129: | Line 218: | ||
@interface MyAnnot { | @interface MyAnnot { | ||
} | } | ||
− | |||
record R(@MyAnnot()int i, int j) { | record R(@MyAnnot()int i, int j) { | ||
} | } | ||
Line 144: | Line 232: | ||
<source lang="java"> | <source lang="java"> | ||
class X6 { | class X6 { | ||
− | |||
public static void main(String[] args) { | public static void main(String[] args) { | ||
record R(int x,int y){} | record R(int x,int y){} | ||
Line 157: | Line 244: | ||
| Compile and run the following code: | | Compile and run the following code: | ||
<source lang="java"> | <source lang="java"> | ||
− | |||
abstract record Point(int x, int y){ | abstract record Point(int x, int y){ | ||
} | } | ||
Line 171: | Line 257: | ||
| Compile and run the following code: | | Compile and run the following code: | ||
<source lang="java"> | <source lang="java"> | ||
− | |||
record Point1(int myInt, char myChar) implements I { | record Point1(int myInt, char myChar) implements I { | ||
public Point1 { | public Point1 { | ||
Line 208: | Line 293: | ||
| Record is created | | Record is created | ||
|- | |- | ||
− | ! colspan="3" | | + | ! colspan="3" | Standard Feature: Instanceof Pattern Matching |
|- | |- | ||
! scope="row" | Postive compilation1 (Instanceof Pattern Matching Example) | ! scope="row" | Postive compilation1 (Instanceof Pattern Matching Example) | ||
| Use the following code: | | Use the following code: | ||
<source lang="java"> | <source lang="java"> | ||
− | |||
public class X { | public class X { | ||
public boolean isBlank(Object o) { | public boolean isBlank(Object o) { | ||
Line 222: | Line 306: | ||
<br> | <br> | ||
<br> | <br> | ||
− | [[File:Pattern- | + | [[File:Pattern-match1_BetaJava16.png]] |
|The pattern variable 's' is in current scope | |The pattern variable 's' is in current scope | ||
|- | |- | ||
Line 228: | Line 312: | ||
| Use the following code: | | Use the following code: | ||
<source lang="java"> | <source lang="java"> | ||
− | |||
public class X { | public class X { | ||
public int size(Object obj) { | public int size(Object obj) { | ||
Line 240: | Line 323: | ||
<br> | <br> | ||
<br> | <br> | ||
− | [[File:Pattern- | + | [[File:Pattern-match2_BetaJava16.png]] |
|The pattern variable 's' is in current scope inside 'then' statement and completion proposes applicable methods on String, the pattern matched type. | |The pattern variable 's' is in current scope inside 'then' statement and completion proposes applicable methods on String, the pattern matched type. | ||
|- | |- | ||
Line 248: | Line 331: | ||
package p; | package p; | ||
− | |||
public class X { | public class X { | ||
public int size(Object obj) { | public int size(Object obj) { | ||
Line 254: | Line 336: | ||
return s.length(); | return s.length(); | ||
} | } | ||
− | return s.length(); // s | + | return s.length(); // s cannot be resolved |
} | } | ||
} | } | ||
Line 261: | Line 343: | ||
<br> | <br> | ||
<br> | <br> | ||
− | [[File:Pattern- | + | [[File:Pattern-match3_BetaJava16.png]] |
− | |The pattern variable 's' is rejected by the compiler when | + | |The pattern variable 's' is rejected by the compiler when cannot be resolved. |
|- | |- | ||
! scope="row" | Negative compilation2 (Instanceof Pattern Matching Example) | ! scope="row" | Negative compilation2 (Instanceof Pattern Matching Example) | ||
| Use the following code: | | Use the following code: | ||
<source lang="java"> | <source lang="java"> | ||
− | |||
public class X { | public class X { | ||
public void foo(Object obj) { | public void foo(Object obj) { | ||
Line 280: | Line 361: | ||
<br> | <br> | ||
<br> | <br> | ||
− | [[File:Pattern- | + | [[File:Pattern-match4_BetaJava16.png]] |
|The pattern variable 's' is rejected by the compiler as "Duplicate local variable s". | |The pattern variable 's' is rejected by the compiler as "Duplicate local variable s". | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
|- | |- |
Latest revision as of 02:50, 12 March 2021
This is an informal page listing examples of features that are implemented by the Java 16 Support, which can be installed from the Marketplace. You are welcome to try out these examples. If you find bugs, please file a bug after checking for a duplicate entry here
Watch out for additional examples being added soon.
NOTE:
- Records is standard features in Java 16.
- Instanceof Pattern Matching is also another standard features in Java 16.
- Sealed Classes is another preview feature in Java 16. They are not enabled by default and can by enabled using --enable-preview.
- In Eclipse, --enable-preview can be enabled from the Preferences. It is implicitly added while launching a java program if the feature has been enabled for the project/workspace.
Feature / Steps | Expected Result | |
---|---|---|
Standard Java/JRE setup with Eclipse | More details can be found on dedicated Java/JRE setup page. | Setting up Java/JRE in Eclipse. |
Overview of eclipse.ini | More details can be found on dedicated eclipse.ini page. | Specifying the JVM in eclipse.ini |
Preview Feature: Sealed Classes | ||
Postive compilation1 (Sealed Class Example) | Use the following code:
@SuppressWarnings("preview") sealed class Y permits X { } @SuppressWarnings("preview") non-sealed class X extends Y { public static void main(String[] args) { System.out.println(0); } } |
Code compiles and prints 0. |
Postive compilation2 (Sealed Class Example) | Use the following code:
@SuppressWarnings("preview") sealed interface I extends SI { } @SuppressWarnings("preview") non-sealed class X implements SI { public static void main(String[] args) { System.out.println(0); } } @SuppressWarnings("preview") sealed interface SI permits X,I { } @SuppressWarnings("preview") non-sealed interface I2 extends I { } |
Code compiles and prints 0. |
Postive compilation3 (Sealed Class Example) | Use the following code:
@SuppressWarnings("preview") sealed class X permits Y { public static void main(String[] args) { System.out.println(100); } } @SuppressWarnings("preview") non-sealed class Y extends X { } |
Code compiles and prints 100. |
Postive compilation4 (Sealed Class Example) | Use the following code:
@SuppressWarnings("preview") sealed public class X<T> { public static void main(String[] args) { System.out.println(100); } } @SuppressWarnings({ "preview", "rawtypes" }) non-sealed class Y extends X { } |
Code compiles and prints 100. |
Negative compilation1 (Sealed Class Example) | Use the following code:
@SuppressWarnings("preview") sealed public sealed class X { public static void main(String[] args) { System.out.println(100); } } |
Code fails to compile with error "Multiple markers at this line
- Sealed class lacks the permits clause and no top level or nested class from the same compilation unit declares X as its direct superclass - Duplicate modifier for the type X" |
Syntax coloring for “sealed”, “non-sealed”, “permits” | New restricted keywords are colored | |
Quick fixes support to add sealed/final/non-sealed modifier on a permitted class declaration. | Three quick fix modifier options:
- sealed - non-sealed - final | |
Quick fixes support to add sealed/non-sealed modifier on a permitted interface declaration. | Two quick fix modifier options:
- sealed - non-sealed | |
"Match locations" dialog supports "Permitted type declarations" | "Search > Java Search > Match locations" dialog supports "Permitted type declarations" check-box option. | |
Standard Feature: Records | ||
Postive compilation1 (Record Example) | Compile and run the following code:
record Point(int x, int y) { } public class X1 { public static void main(String[] args) { Point p = new Point(100, 200); System.out.println(p.x()); } } |
Code compiles and prints 100. |
Positive compilation2 (Nested Record Example) | Compile and run the following code:
class X2 { public static void main(String[] args) { System.out.println(0); } record Point(int x, int y) { } } |
Code compiles and prints 0. |
Positive compilation3 (Record Example) | Compile and run the following code:
class X3 { public static void main(String[] args) { System.out.println(0); } } final record Point(int x, int y) { } |
Code compiles and prints 0. Though a record declaration is implicitly final, it is permitted for the declaration of a record type to redundantly specify the final modifier |
Positive compilation4 | Compile and run the following code:
record R() { } class X4 { public static void main(String[] args) { System.out.println(new R().hashCode()); } } |
Code compiles and prints 0. |
Positive compilation5 | Compile and run the following code:
import java.lang.annotation.Target; import java.lang.annotation.ElementType; @Target({ ElementType.PARAMETER }) @interface MyAnnot { } record R(@MyAnnot()int i, int j) { } class X5 { public static void main(String[] args) { System.out.println(new R(100, 200).hashCode() != 0); } } |
Code compiles and prints true. |
Positive compilation6 | Compile and run the following code:
class X6 { public static void main(String[] args) { record R(int x,int y){} R r = new R(100, 200); System.out.println(r.x()); } } |
Code compiles and prints 100. |
Negative compilation1 (Record Example) | Compile and run the following code:
abstract record Point(int x, int y){ } class X7 { public static void main(String[] args){ System.out.println(0); } } |
Code fails to compile with error "Illegal modifier for the record Point; only public, final and strictfp are permitted" |
Negative compilation2 (Record Example) | Compile and run the following code:
record Point1(int myInt, char myChar) implements I { public Point1 { this.myInt = myInt; this.myChar = myChar; } } public class X8 { public static void main(String[] args) { System.out.println(0); } } interface I { } |
Code fails to compile with error "The canonical constructor Point1 of a record declaration must be declared public." |
Negative compilation3 (Record Example) | Compile and run the following code:
class record { public static void main(String[] args) { System.out.println(0); } } |
Code fails to compile with error "Record is a restricted identifier and hence not a valid type name" |
Record Creation Wizard | Right Click on the Project -> New -> Record or Right Click on the Project -> New -> Other and search for Record or Right Click on the Project -> New -> Other -> Java -> Record
|
Record is created |
Standard Feature: Instanceof Pattern Matching | ||
Postive compilation1 (Instanceof Pattern Matching Example) | Use the following code:
public class X { public boolean isBlank(Object o) { return (o instanceof String s) && s.isBlank(); } } |
The pattern variable 's' is in current scope |
Postive compilation2 (Instanceof Pattern Matching Example) | Use the following code:
public class X { public int size(Object obj) { if (obj instanceof String s) { return s.le } return -1; } } |
The pattern variable 's' is in current scope inside 'then' statement and completion proposes applicable methods on String, the pattern matched type. |
Negative compilation1 (Instanceof Pattern Matching Example) | Use the following code:
package p; public class X { public int size(Object obj) { if (obj instanceof String s) { return s.length(); } return s.length(); // s cannot be resolved } } |
The pattern variable 's' is rejected by the compiler when cannot be resolved. |
Negative compilation2 (Instanceof Pattern Matching Example) | Use the following code:
public class X { public void foo(Object obj) { String s = null; if (obj instanceof Integer s) { } else if (obj instanceof String) { } } } |
The pattern variable 's' is rejected by the compiler as "Duplicate local variable s". |