Java 15 と IntelliJ IDEA

Java 15 では、封印されたクラスと封印されたインターフェイスが導入され、その助けを借りて、言語構文のレベルでクラスとインターフェイスの階層を制限することが可能になりました。可能な階層が宣言的に定義されるようになりました。この機能は、プレビュー モードでも引き続き表示されます。 





また、Java 15 では、Java 14 で導入されたレコードに変更があります。また、instanceof のパターン マッチングは、変更されていない 2 番目のプレビューとして Java 15 で導入されましたJava 13 のテキスト ブロックは、標準の言語構造として Java 15 に含まれています。Java 14 と比較して、それらに変更はありません。 





この記事では、すべての新規および更新された Java 15 言語構造、それらがどのように役立つか、および IntelliJ IDEA でそれらを使用する方法について説明します。はじめましょう。 





封印されたクラスとインターフェース

sealed, , . , , , —  . ?





, . , , . ( ): 





class Plant {}
class Herb extends Plant {}
class Shrub extends Plant {}
class Climber extends Plant{}
class Cucumber extends Climber {}
      
      



, Gardener



() : 





public class Gardener {
   int process(Plant plant) {
       if (plant instanceof Cucumber) {
           return harvestCucumber();
       } else if (plant instanceof Climber) {
           return sowClimber();
       } else if (plant instanceof Herb) {
           return sellHerb();
       } else if (plant instanceof Shrub) {
           return pruneShrub();
       } else {
           System.out.println("Unreachable CODE. Unknown Plant type");
           return 0;
       }
   }

   private int pruneShrub() { .. }
   private int sellHerb() { .. }
   private int sowClimber() { .. }
   private int harvestCucumber() { .. }
}
      
      



, else , . Sealed- . 





sealed-

sealed- sealed



. , , permits



. final



, non-sealed



sealed



.





Gif' , sealed- :





:





sealed public class Plant permits Herb, Shrub, Climber {
}

final class Herb extends Plant {}
non-sealed class Shrub extends Plant {}
sealed class Climber extends Plant permits Cucumber{}

final class Cucumber extends Climber {}
      
      



, (accessibility) (extensibility). sealed- , . , , package-private . . sealed- .





permitted- (reflection) Class.permittedSubclasses()



. sealed- .





IntelliJ IDEA, , .





IntelliJ IDEA

Java 15 IntelliJ IDEA 2020.2, 2020 . Java 15 "Project SDK" "15", "Project language level" — "15 (Preview) – Sealed types, records, patterns, local enums and interfaces".





Java 15 IntelliJ IDEA. "Project Structure" "Platform Settings" "SDKs", "+" "Download JDK". (Vendor), (Version) JDK.





Plant Gardener

sealed- - . else



process()



Gardener



. - else



- return



.





, Java 14 instanceof, Java switch



. switch



. " " , Plant



:





//      Java 15.
//       Java 
//   type-test-pattern  switch 
int processInAFutureJavaVersion(Plant plant) {
   return switch (plant) {
       case Cucumber c -> c.harvestCucumber();
       case Climber cl -> cl.sowClimber();
       case Herb h -> h.sellHerb();
       case Shrub s -> s.pruneShrub();
   }
}
      
      



Sealed- .   sealed- , . .





sealed-, , .





, sealed-, final



, non-sealed



sealed



. final



, non-sealed



, sealed- , — , .





Sealed- . , .





, , Plant



grow()



. Herb



final-, grow()



. Non-sealed Shrub



grow()



. Sealed- Climber



grow()



:





:





sealed abstract public class Plant permits Herb, Shrub, Climber {
   abstract void grow();
}
final class Herb extends Plant {
   @Override
   void grow() {
   }
}
non-sealed abstract class Shrub extends Plant {}
sealed class Climber extends Plant permits Cucumber{
   @Override
   void grow() {
   }
}
final class Cucumber extends Climber {}
      
      



sealed- , permits



, sealed-. .





Sealed-

Sealed- , , ( ), . , sealed-.





final



( , ) sealed



non-sealed



. permits , sealed-, , . final, sealed non-sealed. , Java 14, final, - :





sealed public interface Move permits Athlete, Person, Jump, Kick {
}
final class Athlete implements Move {}
record Person(String name, int age) implements Move {}
non-sealed interface Jump extends Move {}
sealed interface Kick extends Move permits Karate {}
final class Karate implements Kick {}
      
      



Java 15 – (record).





(records)

(records) - (value object). Java 14, Java 15 — .





IntelliJ IDEA,   Java 14 IntelliJ IDEA. IntelliJ IDEA , . 





Java 15 Java 14.





Java 15 . getTopPerformingStocks()



(stock), , .





List<String> getTopPerformingStocks(List<Stock> allStocks, LocalDate date) {
   // TopStock -   (Record)
   record TopStock(Stock stock, double stockValue) {}
   return allStocks.stream()
              .map(s -> new TopStock(s, getStockValue(s, date)))
              .sorted((s1, s2) -> Double.compare(s1.stockValue(), s2.stockValue()))
              .limit(2)
              .map(s -> s.stock.getName())
              .collect(Collectors.toList());
}
      
      



Java 15 . -.





public void createLocalInterface() {
   interface LocalInterface {
       void aMethod();
   }
   // ,  LocalInterface
}

public void createLocalEnum() {
   enum Color {RED, YELLOW, BLUE}
   // ,  enum Color
}
      
      



. , FOO



BAR



:





void test(int input) {
   enum Data {
       FOO(input), BAR(input*2); // .    input
       private final int i;
       Data(int i) {
           this.i = i;
       }
   }
}
      
      



(pattern matching) instanceof

Java- instanceof



. true, , . : - ifTrue - .





Java 14 instanceof



. , .





instanceof



( Java 14 ).





IntelliJ IDEA Java 14 IntelliJ IDEA. IntelliJ IDEA, if .





Java 15 - Java 14.





IntelliJ IDEA Java 14 IntelliJ IDEA.





Sealed- Java 15 . . . , .





, , , , , Java . API, (deprecated). - , JDK ( ).





IntelliJ IDEA Java JDK. , . , Java SE, . , Switch Expressions Java 12 break , yield



. break



Switch Expressions IntelliJ IDEA.





IntelliJ IDEA Java, .





IntelliJ IDEA 2020.2 Java 15. sealed- , (record), (pattern matching) instanceof



(text block). IntelliJ IDEA .





. IntelliJ IDEA.






OTUS Java Developer. Professional. demo day , , OTUS.





  • DEMO DAY








All Articles