Skip to content

Commit be70829

Browse files
author
Yusuke Kanazawa
committed
Support for Java 21
1 parent feb35ff commit be70829

File tree

4 files changed

+2821
-3
lines changed

4 files changed

+2821
-3
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: 108 additions & 1 deletion
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,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

Comments
 (0)