Утильный класс в Котлине (Лучший подход)? - PullRequest
0 голосов
/ 02 ноября 2018

Я играл с Kotlin и создавал класс Util разными способами. Я подхожу к тому, что лучше всего работает для звонков по либо Kotlin, либо Java .

Теперь я создал много типов из Util . И теперь я очень запутался, какой лучше использовать и самый важный почему ? Я нахожу лучший способ с учетом Куча, память, производительность .

Мой вопрос может показаться вам глупым, ребята, но я в лабиринте и сам не могу найти решение.

Вот моя игровая площадка.

Я создал 5 файлов Kotlin . в котором я положил foo () метод. и попытался позвонить по Котлину и Яве.

Класс вызова Bar.kt

class Bar {
    fun bazz() {
        UtilClass.instance.foo()
        UtilClassObject.UtilClassObject.foo()
        UtilCompanionObject.foo()
        UtilFileObject.foo()
        foo() // from UtilFile
    }
}

Вызов класса Qux.java

public class Qux {
    public void bazz() {
        UtilClass.Companion.getInstance().foo();
        UtilClassObject.UtilClassObject.INSTANCE.foo();
        UtilFileKt.foo();
        UtilFileObject.INSTANCE.foo();
        UtilCompanionObject.Companion.foo();
    }
}

А вот лабиринт , который меня смущает, чтобы выбрать лучший.

UtilClass.kt

class UtilClass {
    fun foo() { ... }

    companion object {
        val instance = UtilClass()
    }
}

UtilClassObject.kt

class UtilClassObject {
    object UtilClassObject {
        fun foo() { ... }
    }
}

UtilCompanionObject.kt

class UtilCompanionObject {
    companion object {
        fun foo() { ... }
    }
}

UtilFile.kt

fun foo(){ ... }

UtilFileObject.kt

object UtilFileObject {
    fun foo() { ... }
}

Может потребоваться ответить на мой вопрос и объяснить его хорошо. Поэтому я очень ценю ваши усилия заранее.

1 Ответ

0 голосов
/ 02 ноября 2018

Все параметры присутствуют на справочной странице Kotlin для взаимодействия между Kotlin и Java: https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html

Ваши опции для вызова из Java чего-либо в классе MyUtil и вызова его без экземпляра, такого как MyUtil.foo(), тогда вы просто сделаете один из двух вариантов:

// smallest byte code, 
//   static invocation of foo() from Kotlin side,
//   also static call from Java to foo()
object MyUtil {
    @JvmStatic fun foo() { ... }
}

или

// creates two classes,
//    static lookup of companion followed by virtual call on that instance to foo() from Kotlin, 
//    Java is a static call to foo()
class MyUtil {
    companion object {
        @JvmStatic fun foo() { ... }
    }
}

И вы бы назвали это так же из Котлина MyUtil.foo(). Именно эта модель делает метод Котлина статическим .

Оба примера выглядят из Java одинаково в том смысле, что они представляют собой просто статические вызовы статического метода. Из Kotlin первый пример также является статическим вызовом, второй сначала ищет экземпляр компаньона, а затем выполняет виртуальный вызов метода. Второй пример создает два класса, другой создает только один класс.

Другие опции, которые вы предоставляете, не являются более эффективными и имеют более уродливый синтаксис. Основываясь на наименьшем байтовом коде, наименьшем количестве классов и максимальной производительности, выберите первый пример, который содержит только 1 класс и все статические вызовы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...