Meneruskan metode Java null ke non-nullable dari Kotlin

Misalkan ada perpustakaan Java yang dideklarasikan @NonNullApi, tetapi beberapa metodenya mungkin menggunakan parameter null.

Apakah ada cara untuk mengabaikan persyaratan non-nullability dan meneruskan null ke sana dari Kotlin?

UPD Perlu diklarifikasi: metode dinyatakan sebagai non-nullable oleh perpustakaan pihak ketiga, tidak ada cara untuk mengubah kodenya. Tujuannya adalah untuk mendobrak batasan dari pihak pemanggil.

Cara yang jelas adalah dengan menggunakan Refleksi, tapi mungkin Kotlin hanya menyediakan sintaks untuk itu?


person Adamovskiy    schedule 18.11.2019    source sumber
comment
Beri anotasi pada parameter dengan @Nullable   -  person killjoy    schedule 18.11.2019
comment
Apakah maksud Anda deklarasi parameter? Ini adalah perpustakaan pihak ketiga, tidak dapat mengubahnya.   -  person Adamovskiy    schedule 18.11.2019
comment
Perpustakaan apa itu? Metode apa yang ingin Anda berikan null?   -  person killjoy    schedule 18.11.2019
comment
Jika ada bug di perpustakaan yang membuat parameter ini tidak dapat dibatalkan, maka Anda dapat menulis metode Java yang menerima null dan meneruskannya ke perpustakaan, dan memanggil metode Java ini dari Kotlin.   -  person JB Nizet    schedule 18.11.2019


Jawaban (2)


Seperti yang ditunjukkan oleh jawaban lain di sini, lebih baik tidak mengatasi kontrak nullability dari fungsi Java yang diungkapkan dengan anotasi nullability.

Namun jika Anda benar-benar yakin bahwa anotasi tersebut ada secara tidak sengaja, Anda dapat menggunakan solusi berikut:

  • Deklarasikan fungsi statis pembantu di kelas utilitas Java di samping kode Kotlin Anda. Fungsi ini tidak memiliki anotasi NonNull pada parameter yang harus Anda teruskan null dan hanya meneruskannya ke metode yang dimaksud. Kompiler Java tidak mencegah pemanggilan metode tersebut meskipun anotasi nullability tidak cocok.
  • Impor fungsi pembantu statis tersebut ke Kotlin dan panggil dari sana.
person Ilya    schedule 18.11.2019
comment
Terima kasih! Tentu saja, peretasan ini tidak boleh digunakan untuk API yang dirancang dengan baik. Sangat menyedihkan bahwa hal sederhana seperti itu memerlukan begitu banyak kode. - person Adamovskiy; 18.11.2019
comment
@AlexeyAdamovskiy baiklah,... Saya pikir lebih baik begini (begitu banyak kode) daripada yang lain (memiliki perbaikan sederhana untuk ini)... perancang perpustakaan tidak mau menerima null-nilai di sini... bahwa fungsi bekerja dengan nilai null bisa saja kebetulan... dan jika itu adalah kesalahan dan null harus diterima, sebaiknya Anda menghubungi perancang perpustakaan itu... - person Roland; 19.11.2019

Jawaban yang tidak jelas: jangan lakukan itu!

Dokumentasi API tersebut menyatakan: jangan kirim null dengan cara ini.

Meskipun implementasi hari ini tidak membuat Anda marah karena meneruskan null, siapa bilang itu bukan bug, dan tidak akan diperbaiki di versi mendatang dari pustaka tersebut?

Dengan kata lain: tulis kode Anda agar sesuai dengan API yang ditentukan.

Jika implementasi perpustakaan lebih murah hati daripada spesifikasi API, ikuti aturan yang lebih ketat. Anda bahkan harus mempertimbangkan untuk menulis laporan tetapi untuk perpustakaan itu.

person GhostCat    schedule 18.11.2019