Java 8 から Java 17 にアップグレードする 7 つの理由
Java のパワーを最大限に発揮します。【手動ドッグヘッド】
序章
Java8 から Java18 まで、Java は長い開発プロセスを経てきました (Java20 は長期保守バージョンではありません)。同時に、Java 8 以降、Java エコシステムに多くの変更が加えられました。最も明らかな変更の 1 つは、Java バージョンのリリース頻度の変更です。Java 8 は 2014 年にリリースされましたが、Java 17 は 2021 年にリリースされ、2 つのバージョンの間には 7 年のギャップがありました。しかし、2017 年 9 月、Java プラットフォームのチーフアーキテクトである Mark Reinhold は、Java の機能更新サイクルを 2 年ごとの新バージョンから 6 か月ごとの新バージョンに短縮する提案を発表しました。この提案は提案後すぐに採択され、発効しました。したがって、Java エコシステムの開発者は、最新バージョンの Java 機能をより迅速に使用できるようになります。
私と同じように、Java 8 を長い間使用していて、Java の新しい機能を学ぶ必要があると感じている場合は、この記事が役に立ちます。
Java8 以降、多くの新機能が JDK に追加されましたが、明らかにそのすべてが便利で使いやすく、万人に人気があるわけではありません。そこで、この記事では Java8 以降、Java プログラマに人気の機能をリストアップして学習の参考にしていただくとともに、同僚に自慢できる機能を紹介します。
キー機能
1.ローカル変数の型推論[ローカル変数の型推論]
Java 8 以降に追加されたおそらく最も人気のある機能であるローカル変数の型推論を使用すると、型を指定せずにローカル変数を宣言できます。実際のコードを実行するときの型は、式の右辺の内容から推測され、var型とも呼ばれます。(はい、徐々にJsになります)。
例: var a = 1
Java8はローカル変数を使用します
URL url = new URL("https://www.baidu.com");
System.out.println(url.getClass());
Java10 にローカル変数の型推論が追加された後
var url = new URL("https://www.baidu.com");
System.out.println(url.getClass());
上記のコードの最終出力はまったく同じですが、明らかに Java10 以降では、特定のローカル変数の型を宣言する必要はありません。
ps: Java8 の lombok も同様の関数を提供しており、これも var ですが、パッケージをインポートする必要があります。
import lombok.var; import org.junit.jupiter.api.Test; import java.net.MalformedURLException; import java.net.URL; //使用 lombok public class JdkTests { @Test public void test1() throws MalformedURLException { var url = new URL("https://www.baidu.com"); System.out.println(url.getClass()); } }
2.スイッチ式[スイッチ式拡張]
Java 14 で switch 式を使用する場合、switch ステートメントから抜け出すために Break キーワードを使用する必要はなく、値を返すために各 switch ケースで return キーワードを使用する必要もありません。代わりに、 switch 式全体を返します。この強化された switch 式により、コード全体がすっきりして読みやすくなります。
Java8でスイッチを使用する
int flag = 1;
switch(flag) {
case 1:
System.out.println("hello");
break;
case 2:
System.out.println("world");
break;
case 3:
System.out.println("hello world");
break;
case 4:
System.out.println("hello");
break;
default:
System.out.println("haha");
}
Java14以降はスイッチを使用してください
int flag = 1;
switch(flag) {
case 1,4 -> System.out.println("hello");
case 2 -> System.out.println("world");
case 3 -> System.out.println("hello world");
default -> System.out.println("haha");
}
3.テキストブロック[テキストブロック]
テキスト ブロックは、エスケープ記号を使用せずに複数行の文字列を作成できる Java 15 の新機能です。コード内にJsonを書いて改行したいときなどにとても快適です。次の例を通して、テキスト ブロックを使用するとコードがいかに簡潔で快適になるかがわかります。
Java8
String json = "{\n" +
" "id": 3,\n" +
" "username": "fake_data",\n" +
" "password": "fake_data",\n" +
" "ips": [\n" +
" "fake_data"\n" +
" ],\n" +
" "firstLoginTime": 29,\n" +
" "lastLoginTime": 69,\n" +
" "failedAttempts": 62,\n" +
" "lockedUntil": "2013-11-20 20:23:23"\n" +
"}";
Java15以降
String json = """
{"id": 3,
"username": "fake_data",
"password": "fake_data",
"ips": ["fake_data"],
"firstLoginTime": 29,
"lastLoginTime": 69,
"failedAttempts": 62,
"lockedUntil": "2013-11-20 20:23:23"}
""";
System.out.println(json);
4.レコード[レコードクラス]
レコード クラスは、Java14 で導入されたクラスを宣言する新しい方法 (クラスの前後) です。このキーワードを使用すると、少ないコードで POJO に似たクラスを作成できます (有害です。これは、User クラス、Student クラスなどの通常の Java クラス、または詳細に分割する必要のないエンティティ クラスです)。 。以前と比較して、ほとんどの開発者は POJO クラスの記述を簡素化するために Lombok を使用していました (get set などを記述する必要がありません)。しかし、現在では、レコードを使用することで、サードパーティのライブラリを使用する必要がなく、コードをより簡潔に記述します。以下の例では、レコード コードがいかに簡潔であるかがわかります。
Java8
public class User {
private String name;
private String password;
public User() {
}
public User(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Java8はロンボクを使用します
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {
private String name;
private String password;
}
使用記録
public record User(String name,String password) {}
テストコード
@Test
public void test7() {
User user = new User("2","3");
System.out.println(user.name());
}
5.instanceof[パターンマッチングのインスタンス]のパターンマッチング
instanceof パターン マッチングは、Java 16 で追加された新機能です。これにより、instanceof 演算子を式として使用し、変換されたオブジェクトを返すことができます (強制は必要ありません)。ネストされた if-else ステートメントを処理する場合に便利です。以下の例では、instanceof 演算子を使用してキャストせずに Employee オブジェクトを返す方法がわかります。
Java8
if (obj instanceof Employee){
Employee emp = (Employee)obj;
return emp.getName();
}
パターンマッチングのインスタンスを使用する
if (obj instanceof Employee emp){
return emp.getName();
}
6.シールドクラス[シールドクラス]
囲まれたクラスは、Java 17 で追加された新機能です。これにより、クラスまたはインターフェイスの継承を限られたサブクラスのセットに制限できます。簡単に言うと、UserServieImpl によってのみ実装したい UserService インターフェイスがあるとします。以前は制限されていませんでしたが、Sealed クラス機能が追加されたので、どうすればよいでしょうか?
sealed 修飾子を使用してクラスを sealed クラスとして記述し、permits キーワードを使用してこのクラスを継承または実装できる型を指定します。sealed が変更できるのはクラス (クラス) またはインターフェイス (インターフェイス) であるため、permits キーワードの位置は extends またはimplements の後にある必要があることに注意してください。
例:
UserService が UserServiceImpl と UserServiceFinalImpl によってのみ実装できることを宣言するには、sealed を使用します。
コトリン
コードをコピーする
public sealed interface UserService permits UserServiceImpl, UserServiceFinalImpl{ }
sealed (継承クラスも同様)、サブクラス、または実装クラスで宣言されたインターフェイスを実装したい場合は、final または non-sealed で変更する必要があります。
ジャワ
コードをコピーする
public final class UserServiceFinalImpl implements UserService{ } public non-sealed class UserServiceImpl implements UserService{ }
上記 2 つの違いは次のとおりです。
最終的に変更された実装クラスはそれ以上継承できませんが、シールされていない変更された実装クラスはさらに継承できます。
スカラ
コードをコピーする
//进一步继承 public class UserServiceImplNonSealed extends UserServiceImpl{ }
7.便利な NullPointerException
NullPointerExceptions は、Java 14 で追加された新機能です。これにより、NullPointerExceptions に関する詳細情報を取得できます。これは、NullPointerExceptions をデバッグするときに非常に便利です。以下の例では、同じコードが Java 8 と Java 14 で異なる NullPointerException を生成することがわかりますが、Java 14 では例外に関する詳細情報を取得できます。(より多くの例外スタック情報を確認すると、バグをより正確に見つけることができます)
まとめ
この記事では Java 17 以降に追加されたすべての機能を取り上げたわけではありませんが、最も人気のある機能を取り上げました。Java の新機能について詳しく知りたい場合は、以下のリンクを参照することをお勧めします。