0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Java】Kotlin経験者が気になった違いまとめ

Last updated at Posted at 2024-05-14

クラスの生成方法の違い

  • インスタンス化時には、クラス名の前にnewが必要

プリミティブ型

  • BooleanやIntegerは、ラッパークラスであり、nullが許容される
  • booleanやintは、プリミティブ型であり、nullはコンパイルエラーとなる

拡張メソッド、プロパティが定義できない

  • Kotlinで定義した拡張メソッド、プロパティをJavaから呼び出すことは可能
    JavaSample2.java
    public class JavaSample2 {
    }
    
    JavaSample2Ext.kt
    // 拡張プロパティの定義
    @get:DrawableRes
    val JavaSample2.iconResourceId: Int get() {
        return R.drawable.ic_launcher_background
    }
    
    // 拡張メソッドの定義
    fun JavaSample2.sayHello(name: String) {
        // TODO:
    }
    
    JavaSample.kt
    public class JavaSample {
        void say(String name) {
            JavaSample2 javaSample2 = new JavaSample2();
    
            // 拡張プロパティの呼び出し
            Integer resId = JavaSample2ExtKt.getIconResourceId(javaSample2);
    
            // 拡張メソッドの呼び出し
            JavaSample2ExtKt.sayHello(javaSample2, name);
        }
    }
    

nullがコンパイル時にわからない

  • @NotNullまたは、@NonNullを定義時に付けとくと、エディターで警告⚠️が出るようにはなる

nullのアンラップが冗長になる

  • ?:や、?.が使用できない

スコープ関数がない

  • let, alsoなどが使用できない
  • 配列クラスの.forEach.filterは使用できる

デフォルト引数が定義できない

  • 多く呼び出し箇所をもつメソッドに引数を追加したときに困る時がある
  • 対処法
    • 新たにメソッドを定義し、古いメソッドからそれを呼び出す(この時デフォルト値を渡す)
    public class JavaSample2 {
        void methodOld() {
            methodNew("This is default value");
        }
    
        void methodNew(String name) {
            // 元の処理
        }
    }
    

sealedクラスが、switch文(when文)のパターンマッチに使用できない

  • Java8では不可能。Java17から利用できる。
  • このため、enumクラスを定義するなどして対応する必要がある

変数の定義方法

  • valがない。finalが似た扱い。
  • 型を先に書く
  • 型に?を付けてなくても、基本的に全てnullableになってしまう

関数の定義順序

  • funを書かない
  • 戻り値の型 関数名の順
  • 何も返さない場合でも、voidが必要

クロージャーを引数に渡す方法の違い

  • 戻り値がVoidの場合に詰まった。return nullが必要
    SampleViewItem.kt
    class SampleViewItem(
        val onItemTapped: (Int) -> Unit,
    ) {
        val index = 1
    
        fun onTapped() {
            onItemTapped(1)
        }
    }
    
    JavaSample.java
    public class JavaSample {
        void setUp() {
            SampleViewItem sampleViewItem = new SampleViewItem((index) -> {
                handleTap(index);
                return null; // これが必要
            });
        }
    
        void handleTap(Integer index) {
            // 処理
        }
    }
    

コンストラクタの定義方法

  • Javaではconstructor() ではなく、クラス名()で定義する

companion objectがない

  • Javaではstatic修飾子を付けたものになる

知っとくと良いもの

  • kotlin -> binary -> javaへのデコンパイル方法
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?