@@ -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,7 @@ head:
520520 ソースコード管理システム、バグトラッキングシステムで管理している内容はソースコードにコメントで記載する必要はない。
521521 - コメントアウトされたコード
522522 ソースコード管理システムで管理されている
523+ - サンプルコードを記載する場合は、`{@snippet }`タグを利用する。
523524
524525## インポート
525526
@@ -1002,6 +1003,8 @@ head:
10021003 (o instanceof Collection && ((Collection )o). isEmpty());
10031004 ```
10041005
1006+ - パターンマッチングについては[switch文・式で使用する](#switchでのパターンマッチング)ことも可能。
1007+
10051008## 制御構造
10061009
10071010- 制御文( `if` , `else` , `while` , `for` , `do while` )の `{ }` は省略しない
@@ -1536,6 +1539,42 @@ head:
15361539 };
15371540 ```
15381541
1542+ ## switch でのパターンマッチング
1543+
1544+ - `instanceof `ではなく`switch `文や式に拡張されたパターンマッチングで記載する。
1545+
1546+ 良い例:
1547+
1548+ ```java
1549+ static String formatterPatternSwitch (Object obj ) {
1550+ return switch (obj) {
1551+ case Integer i - > String . format(" int %d" , i);
1552+ case Long l - > String . format(" long %d" , l);
1553+ case Double d - > String . format(" double %f" , d);
1554+ case String s - > String . format(" String %s" , s);
1555+ default - > obj. toString();
1556+ };
1557+ }
1558+ ```
1559+
1560+ 悪い例:
1561+
1562+ ```java
1563+ static String formatter (Object obj ) {
1564+ String formatted = " unknown" ;
1565+ if (obj instanceof Integer i) {
1566+ formatted = String . format(" int %d" , i);
1567+ } else if (obj instanceof Long l) {
1568+ formatted = String . format(" long %d" , l);
1569+ } else if (obj instanceof Double d) {
1570+ formatted = String . format(" double %f" , d);
1571+ } else if (obj instanceof String s) {
1572+ formatted = String . format(" String %s" , s);
1573+ }
1574+ return formatted;
1575+ }
1576+ ```
1577+
15391578## コレクション
15401579
15411580- Java2 以降のコレクションクラスを利用する
@@ -1602,6 +1641,44 @@ head:
16021641 `Arrays.asList ()`で生成した`List`は、サイズのみ不変で、`set`等による値の操作が可能な`List`です。
16031642 また、`set`を行った場合、`Arrays.asList ()`に与えられた配列インスタンスにも影響します。
16041643
1644+ ## 順序を保持するコレクション
1645+
1646+ - 要素の順序に関する操作(最初の要素や最後の要素へのアクセス、追加、削除、逆順処理など)には、`SequencedCollection`、`SequencedSet`、`SequencedMap` インターフェースで定義された**専用のメソッド**(`getFirst ()`、`getLast ()`、`addFirst ()`、`addLast ()`、`removeFirst ()`、`removeLast ()`、`reversed ()`、`putFirst ()`、`putLast ()`、`firstEntry ()`、`lastEntry ()` )の使用を推奨する。従来の記述と専用メソッドで性能面の違いはないので、どちらを使用するか各プロジェクトで揺れがないように統一する。
1647+
1648+ 良い例:
1649+
1650+ ```java
1651+ import java.util.SequencedCollection;
1652+ import java.util. ArrayList ;
1653+
1654+ SequencedCollection<String > items = new ArrayList<> ();
1655+ items.addFirst ("A ");
1656+ items.addLast ("B ");
1657+ String firstItem = items. getFirst();
1658+ String lastItem = items. getLast();
1659+ SequencedCollection<String > reversedItems = items.reversed ();
1660+ ```
1661+
1662+ 悪い例:
1663+
1664+ ```java
1665+ import java.util. List ;
1666+ import java.util. ArrayList ;
1667+ import java.util. Collections ;
1668+
1669+ List<String > items = new ArrayList<> ();
1670+ items.add (0 , "A ");
1671+ items.add ("B ");
1672+ String firstItem = items. get(0 );
1673+ String lastItem = items. get(items. size() - 1 );
1674+ List<String > reversedItems = new ArrayList<> (items);
1675+ Collections.reverse (reversedItems );
1676+ ```
1677+
1678+ ※ `reversed ()`で取得されるのは元のインスタンスの参照であるため、要素を変更すると元のインスタンスに反映されることに注意。
1679+
1680+ - 大量の要素に対する先頭や末尾への頻繁な追加・削除操作は、`ArrayList` のような実装では要素のシフトが発生するため、パフォーマンスに影響を与える可能性があります。このような場合は、`LinkedList` や `ArrayDeque` など、**両端の操作が効率的な実装**を選択することを検討してください。
1681+
16051682## ラムダ式・メソッド参照・コンストラクタ参照
16061683
16071684- ラムダ式が利用できる箇所はラムダ式を利用してよい
@@ -1994,6 +2071,36 @@ head:
19942071 }
19952072 ```
19962073
2074+ ## レコードパターン
2075+
2076+ - データの分解と型チェックを同時に行えるレコードパターンは、コードの可読性と安全性を向上させるため、レコードを使用する場合はレコードパターンを用いて記述することを推奨する。
2077+
2078+ 良い例:
2079+
2080+ ```java
2081+ static void execute(Object obj) {
2082+ if (obj instanceof Point(int x, int y)) {
2083+ System . out. println(x + y);
2084+ }
2085+ }
2086+ ```
2087+
2088+ 悪い例:
2089+
2090+ ```java
2091+ if (obj instanceof Point p) {
2092+ int x = p. x();
2093+ int y = p. y();
2094+ System . out. println(x+ y);
2095+ }
2096+ ```
2097+
2098+ ## シールクラス
2099+
2100+ - 明確な方針で、利用する・利用しないを統一すること
2101+ 方針無く、`sealed`を利用するとコードの保守性や柔軟性が悪くなります。
2102+ 各プロジェクトで、`sealed`を利用しないか、`sealed`を利用しても良い箇所について方針を決めた上で使用するようにしてください。 (例:プロジェクト内で使用する共通機能ライブラリに限定して使用する。)
2103+
19972104## テキストブロック
19982105
19992106次のリンクも参考にしてください。
0 commit comments