@@ -5,7 +5,7 @@ author: Future Enterprise Coding Standards
55head :
66 - - meta
77 - name : keywords
8- content : Javaコーディング規約,Java17 ,コーディング規約,Java
8+ content : Javaコーディング規約,Java21 ,コーディング規約,Java
99---
1010
1111<page-title />
@@ -520,6 +520,30 @@ head:
520520 ソースコード管理システム、バグトラッキングシステムで管理している内容はソースコードにコメントで記載する必要はない。
521521 - コメントアウトされたコード
522522 ソースコード管理システムで管理されている
523+ - サンプルコードを記載する場合は、`{@snippet }`タグを利用する。
524+
525+ 外部ファイルから引用する例:
526+
527+ ```java
528+ /**
529+ * ユーザー登録処理の例
530+ * {@snippet file="UserRegistrationExample.java" region="registration"}
531+ */
532+ ```
533+
534+ インラインでサンプルコードを記載する例:
535+
536+ ```java
537+ /**
538+ * ユーザー登録処理の例
539+ * {@snippet :
540+ * User user = new User();
541+ * user.setName("田中太郎");
542+ * user.setEmail("tanaka@example.com");
543+ * userRepository.save(user);
544+ * }
545+ */
546+ ```
523547
524548## インポート
525549
@@ -1002,6 +1026,8 @@ head:
10021026 (o instanceof Collection && ((Collection )o). isEmpty());
10031027 ```
10041028
1029+ - パターンマッチングについては[switch文・式で使用する](#switchでのパターンマッチング)ことも可能。
1030+
10051031## 制御構造
10061032
10071033- 制御文( `if` , `else` , `while` , `for` , `do while` )の `{ }` は省略しない
@@ -1518,8 +1544,8 @@ head:
15181544 boolean off = false ;
15191545 switch (day ) {
15201546 case SUNDAY , SATURDAY :
1521- off = true ;
1522- break ;
1547+ off = true ;
1548+ break ;
15231549 };
15241550 ```
15251551
@@ -1531,11 +1557,47 @@ head:
15311557 switch (day ) {
15321558 case SUNDAY :
15331559 case SATURDAY :
1534- off = true ;
1535- break ;
1560+ off = true ;
1561+ break ;
15361562 };
15371563 ```
15381564
1565+ ## switch でのパターンマッチング
1566+
1567+ - `instanceof `ではなく`switch `文や式に拡張されたパターンマッチングで記載する。
1568+
1569+ 良い例:
1570+
1571+ ```java
1572+ static String formatterPatternSwitch (Object obj ) {
1573+ return switch (obj) {
1574+ case Integer i - > String . format(" int %d" , i);
1575+ case Long l - > String . format(" long %d" , l);
1576+ case Double d - > String . format(" double %f" , d);
1577+ case String s - > String . format(" String %s" , s);
1578+ default - > Objects . toString(obj);
1579+ };
1580+ }
1581+ ```
1582+
1583+ 悪い例:
1584+
1585+ ```java
1586+ static String formatter (Object obj ) {
1587+ String formatted = " unknown" ;
1588+ if (obj instanceof Integer i) {
1589+ formatted = String . format(" int %d" , i);
1590+ } else if (obj instanceof Long l) {
1591+ formatted = String . format(" long %d" , l);
1592+ } else if (obj instanceof Double d) {
1593+ formatted = String . format(" double %f" , d);
1594+ } else if (obj instanceof String s) {
1595+ formatted = String . format(" String %s" , s);
1596+ }
1597+ return formatted;
1598+ }
1599+ ```
1600+
15391601## コレクション
15401602
15411603- Java2 以降のコレクションクラスを利用する
@@ -1602,6 +1664,44 @@ head:
16021664 `Arrays.asList ()`で生成した`List`は、サイズのみ不変で、`set`等による値の操作が可能な`List`です。
16031665 また、`set`を行った場合、`Arrays.asList ()`に与えられた配列インスタンスにも影響します。
16041666
1667+ ## 順序を保持するコレクション
1668+
1669+ - 要素の順序に関する操作(最初の要素や最後の要素へのアクセス、追加、削除、逆順処理など)には、`SequencedCollection`、`SequencedSet`、`SequencedMap` インターフェースで定義された**専用のメソッド**(`getFirst ()`、`getLast ()`、`addFirst ()`、`addLast ()`、`removeFirst ()`、`removeLast ()`、`reversed ()`、`putFirst ()`、`putLast ()`、`firstEntry ()`、`lastEntry ()` )の使用を推奨する。従来の記述と専用メソッドで性能面の違いはないので、どちらを使用するか各プロジェクトで揺れがないように統一する。
1670+
1671+ 良い例:
1672+
1673+ ```java
1674+ import java.util.SequencedCollection;
1675+ import java.util. ArrayList ;
1676+
1677+ SequencedCollection<String > items = new ArrayList<> ();
1678+ items.addFirst ("A ");
1679+ items.addLast ("B ");
1680+ String firstItem = items. getFirst();
1681+ String lastItem = items. getLast();
1682+ SequencedCollection<String > reversedItems = items.reversed ();
1683+ ```
1684+
1685+ 悪い例:
1686+
1687+ ```java
1688+ import java.util. List ;
1689+ import java.util. ArrayList ;
1690+ import java.util. Collections ;
1691+
1692+ List<String > items = new ArrayList<> ();
1693+ items.add (0 , "A ");
1694+ items.add ("B ");
1695+ String firstItem = items. get(0 );
1696+ String lastItem = items. get(items. size() - 1 );
1697+ List<String > reversedItems = new ArrayList<> (items);
1698+ Collections.reverse (reversedItems );
1699+ ```
1700+
1701+ ※ `reversed ()`で取得されるのは元のインスタンスの参照であるため、要素を変更すると元のインスタンスに反映されることに注意。
1702+
1703+ - 大量の要素に対する先頭や末尾への頻繁な追加・削除操作は、`ArrayList` のような実装では要素のシフトが発生するため、パフォーマンスに影響を与える可能性があります。このような場合は、`LinkedList` や `ArrayDeque` など、**両端の操作が効率的な実装**を選択することを検討してください。
1704+
16051705## ラムダ式・メソッド参照・コンストラクタ参照
16061706
16071707- ラムダ式が利用できる箇所はラムダ式を利用してよい
@@ -1994,6 +2094,50 @@ head:
19942094 }
19952095 ```
19962096
2097+ ## レコードパターン
2098+
2099+ - レコードパターンは、データの分解と型チェックを同時に行えるため、冗長なコードの削減、型安全性の向上、IDE による補完やリファクタリング支援などのメリットがあります。
2100+ これにより、コードの可読性・保守性・安全性が高まるため、レコードを使用する場合はレコードパターンを用いて記述することを推奨します。
2101+
2102+ 良い例:
2103+
2104+ ```java
2105+ static void execute(Object obj) {
2106+ if (obj instanceof Point(int x, int y)) {
2107+ System . out. println(x + y);
2108+ }
2109+ }
2110+ ```
2111+
2112+ 悪い例:
2113+
2114+ ```java
2115+ if (obj instanceof Point p) {
2116+ int x = p. x();
2117+ int y = p. y();
2118+ System . out. println(x+ y);
2119+ }
2120+ ```
2121+
2122+ ## シールクラス
2123+
2124+ - 明確な方針で、利用する・利用しないを統一すること
2125+ 方針無く、`sealed`を利用するとコードの保守性や柔軟性が悪くなります。
2126+ 各プロジェクトで、`sealed`を利用しないか、`sealed`を利用しても良い箇所について方針を決めた上で使用するようにしてください。
2127+
2128+ 方針例:
2129+ - プロジェクト内で使用する共通機能ライブラリに限定して使用する
2130+ - 外部公開API では禁止し、内部ユーティリティやドメイン層のみ許可する
2131+ - サードパーティ連携部分では利用しない
2132+ - 全体で利用しない
2133+ など、用途や公開範囲に応じて具体的な方針を決めてください。
2134+
2135+ ** 【補足:シールクラス(sealed classes)とは】**
2136+ Java のsealedクラスは、継承できるサブクラスを明示的に制限する仕組みです。
2137+ これにより、ドメインモデルの制約強化やパターンマッチングの網羅性チェックが可能となり、意図しない拡張や誤用を防ぐことができます。
2138+ 典型的な利用例としては、状態や種類が限定されるドメイン(例:イベント種別、計算式のノード型など)の表現や、パターンマッチング(switch 文・式)で全ケースを網羅的に扱いたい場合などが挙げられます。
2139+ メリットは安全性・可読性の向上ですが、柔軟な拡張が難しくなるデメリットもあるため、利用方針を明確に定めてください。
2140+
19972141## テキストブロック
19982142
19992143次のリンクも参考にしてください。
0 commit comments