こんにちは、JavaRush 学生の皆さん、Java に完全に夢中になる前に、視野を広げて、ますます人気が高まっているKotlin言語 に注目していただきたいと思います。
Kotlin は、 JetBrainsによって開発されたかなり新しい言語です。はい、はい、私たちのお気に入りの IDE、IntelliJ IDEA を開発したのと同じ会社です。Kotlin は JVM 言語であり、Java と完全な互換性があります。つまり、Kotlin コードから使い慣れた Java ライブラリに簡単にアクセスできます。ライブラリについては、Kotlin クラスと Java クラスは 1 つのパッケージで共存できます。Kotlin はプログラミング コミュニティで非常に人気があったため、Google は Android の公式開発言語として Kotlin を認め、最近ではエンタープライズ プロジェクトでも Kotlin の人気が高まり始めています。この記事では、Kotlin と Java で書かれたコードの比較例をいくつか示し、いくつかの結論を導き出したいと思います。行く! いつものように「Hello World」から始めましょう
// Java
public class Application {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
// Kotlin
class Application
fun main(vararg args: String) {
println("Hello World!")
}
Kotlin の例を見ると、次のことがすぐにわかります。
- 行末にセミコロンを書く必要はありません。
- すべてのメソッドはfunキーワードで記述されます。
- 行を印刷するには、println()という 1 つの単語だけで十分です。
// Java (до 10)
final Application application = new Application();
// Kotlin
val application = Application()
Kotlin の違い:
- 変数の型がインスタンスから明らかな場合、変数の型を宣言する必要はありません。
- 変数 type - val (不変) またはvar (変更可能) の代わりに。
- インスタンスを作成するために新しいキーワードを記述する必要はありません。
// Java
public int sum(int a, int b) {
return (a + b);
}
// Kotlin
fun sum(a: Int, b: Int): Int {
return (a + b)
}
Kotlin の違い:
- メソッドから何かを返す必要がある場合は、「: Int」がシグネチャに追加されます。ここで、Intは戻り値の型です。
- メソッドパラメータの説明: 最初に変数名、次に型。
- メソッド本体は 1 行のみで構成されているため、returnを省略できます。
fun sum(a: Int, b: Int): Int = (a+b)
// Java
public int sum(int a, int b) {
int result = (a + b);
System.out.printf("Сумма %d и %d равна %d\n", a, b, result);
return result;
}
// Kotlin
fun sum(a: Int, b: Int): Int {
val result = (a + b)
println("Сумма $a и $b равна $result")
return result
}
Kotlin は文字列補間をサポートしています。変数の先頭に「$」記号を使用するだけです。この表記法により、コードのクリーンさと読みやすさが大幅に向上します。 インスタンスの比較
// Java
object1.equals(object2)
// Kotlin
object1 == object2
==
Kotlin では、オブジェクト型の 比較 " " はequals
!に変換されます。また、リンクの比較には「===
」を使用します。 例外
// Java
public List<String> getFileContent(String file) throws IOException {
Path path = Paths.get(file);
return Files.readAllLines(path);
}
// Kotlin
fun getFileContent(file: String): List<String> {
val path = Paths.get(file)
return Files.readAllLines(path)
}
Kotlin にはチェック例外が存在しないため、アプリケーション全体で延々と例外をスローしたり、マルチレベルの例外を作成したりする必要がなくなりましたtry-catch
。 ヌルセーフティ
// Java
public class Data {
String value;
String render() {
if (value == null) {
return "Value: undefined";
} else {
return "Value:" + value.toUpperCase();
}
}
}
// Kotlin
class Data {
var value: String? = null
fun render(): String =
"Value: ${value?.toUpperCase() ?: "undefined"}"
}
Kotlin は NPE 問題に対処し、いくつかの要件を導入しました。
- すべてのクラスのフィールドと変数は初期化する必要があります。
- フィールドまたは変数に「null」を書き込むことはできますが、その場合は変数が Null 可能であることを明示的に示す必要があります (「?」記号を書きます)。
- エルビス演算子「?:」は次のように機能します。左側に Null がある場合は、右側にあるものを取得します。この例の場合、value変数が初期化されていない場合、値「unknown」が取得されます。
// Java
public class Data {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
class App {
void execute() {
Data data = new Data()
data.setValue("Foo")
}
}
// Kotlin
class Data {
var value: String = ""
}
class App {
fun execute() {
val data = Data()
data.value = "Foo" // Под капотом выполнится data.set("Foo")
}
}
Kotlin では、単にフィールドを記述するだけで十分です。フィールドには暗黙的なゲッターとセッター (hello lombok ) がすでにあり、必要に応じていつでもオーバーライドできます。同時に、フィールドに直接アクセスするだけでフィールドの値を読み取り、変更します。内部では と呼ばれますget()|set()
。 サイクル
// Java
void example() {
for(int i = 1; i <= 10; i++) {
System.out.println(i);
}
for(String line : "a,b,c".split(",")) {
System.out.println(line);
}
}
// Kotlin
fun example() {
for(i in 1..10) {
println(i)
}
for(line in "a,b,c".split(",")) {
println(line)
}
}
Kotlin は、シーケンスを走査するための便利で統一された構文を提供しています。左側に変数、右側にシーケンス、そしてその間にキーワード「in」を使用するだけで、型はコンテンツによって自動的に決定されます。 シングルトン
// Java
public class Singleton {
private static Singleton ourInstance = new Singleton();
public static Singleton getInstance() {
return ourInstance;
}
private Singleton() {
}
}
class App {
void execute() {
Singleton singleton = Singleton.getInstance()
}
}
// Kotlin
object Singleton {}
class App {
fun execute() {
val singleton = Singleton
}
}
よく知られた「singler」パターンは実際に頻繁に使用されるため、Kotlin は別のキーワード「object 」を作成することにしました。これは「 class 」の代わりに記述され、クラスがシングルトンであることを意味します。使用する場合、コンストラクターまたは他のメソッドを呼び出す必要があります。 名前付きメソッドのパラメータとデフォルト値
// Java
void setStatus(String code) {
setStatus(code, "");
}
void setStatus(String code, String desc) {
this.code = code;
this.desc = desc;
}
// Kotlin
fun setStatus(code: String, desc: String = "") {
this.code = code;
this.desc = desc;
}
fun execute() {
setStatus("200")
setStatus(code = "200", desc = "Ok")
}
メソッドまたはコンストラクター内のすべてのパラメーターが必要なわけではありません。Java では、考えられるパラメーターのすべての組み合わせに対してメソッドまたはコンストラクターのセットを作成することに慣れています。Kotlin にはデフォルト パラメーターが導入されており、1 つのメソッドを宣言し、状況に応じて必要なパラメーターのセットをそれに渡すことができます。 ストリーム
// Java
String getFirst(List<String> strings, String alpha) {
return strings.stream()
.filter(x -> x.startsWith(alpha))
.findFirst()
.orElse("");
}
// Kotlin
fun getFirst(strings: List<String>, alpha: String): String {
return strings.first { it.startsWith(alpha) }
}
Java 8 でのストリームの導入は、コレクションを操作する場合に不可欠な機能になりました。Kotlin では、ストリームがさらに便利で機能的になりました。各コレクションには、データを操作するための便利で頻繁に使用されるメソッドのセットがすでに含まれています。また、最初のメソッド内のラムダ式に注目してください。関数リテラルにパラメーターが 1 つだけある場合、その宣言は (-> とともに) 削除され、 itとして参照されます。 そろそろまとめの時間です... 私は機能のほんの一部の基本的な部分だけをデモしましたが、きっとすでに Kotlin を試してみたいと思っているはずです。私の経験から、次の結論を導き出すことができます。
- Java 開発者が Kotlin 構文をマスターしてコードを書き始めるのは非常に簡単です。
- Kotlin は Java と完全な互換性があるため、テストなどの既存のプロジェクトですでに試すことができます。
- Kotlin コードはよりクリーンで読みやすく、大量の定型文を記述する必要はありません。
- IDEA には Java から Kotlin への自動コンバーターがあり、既製の Java コードを取得して自動的に Kotlin に変換できます。
- 新しいプロジェクトは Kotlin で作成する必要があります。インフラストラクチャの観点からは Java と同じですが、使用の観点からは Kotlin の方が優れており便利です。
GO TO FULL VERSION