Skip to content

Commit 2e62ad4

Browse files
yknzYusuke Kanazawagithub-actions[bot]ota-meshishout-star
authored
Support for Java 21 (#242)
* Support for Java 21 * Format (#243) Co-authored-by: ota-meshi <[email protected]> * docs: Improve document - @snippetのサンプルコードを追加 - シールクラスの記述をブラッシュアップ - レコードパターンの記載を校正 - switchのパターンマッチングのコードサンプルでNullPointerExceptionが出てしまう場合を考慮 - switch文のコード例でインデント不正を修正 --------- Co-authored-by: Yusuke Kanazawa <[email protected]> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: ota-meshi <[email protected]> Co-authored-by: KENICHI HOSHI <[email protected]>
1 parent 7f45d4b commit 2e62ad4

File tree

4 files changed

+2862
-7
lines changed

4 files changed

+2862
-7
lines changed

.vitepress/config.mjs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ const links = {
2121
text: "Javaコーディング規約",
2222
link: "/documents/forJava/Javaコーディング規約.html",
2323
},
24+
{
25+
text: "For Java17",
26+
link: "/documents/forJava/Javaコーディング規約_for_17.html",
27+
},
2428
{
2529
text: "For Java11",
2630
link: "/documents/forJava/Javaコーディング規約_for_11.html",
@@ -140,6 +144,10 @@ export default defineConfig({
140144
text: "Javaコーディング規約",
141145
link: "/documents/forJava/Javaコーディング規約.html",
142146
},
147+
{
148+
text: "Javaコーディング規約 for Java17",
149+
link: "/documents/forJava/Javaコーディング規約_for_17.html",
150+
},
143151
{
144152
text: "Javaコーディング規約 for Java11",
145153
link: "/documents/forJava/Javaコーディング規約_for_11.html",

documents/forJava/Javaコーディング規約.md

Lines changed: 149 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ author: Future Enterprise Coding Standards
55
head:
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

Comments
 (0)