Вспомогательные классы в котлине [дубликат]

Насколько мне известно, не в CSS 2. CSS 3 имеет более надежные селектор, но не всегда реализуется во всех браузерах. Даже с улучшенными селекторами я не верю, что он выполнит именно то, что вы указали в своем примере.

343
задан pdeva 1 November 2016 в 01:52
поделиться

23 ответа

Вы помещаете функцию в «объект-компаньон».

Таким образом, java-код выглядит следующим образом:

class Foo {
  public static int a() { return 1; }
}

станет

class Foo {
  companion object {
     fun a() : Int = 1
  }
}

Затем вы можете использовать его из кода Котлина как

Foo.a();

. Но из кода Java вам нужно будет называть его как

Foo.Companion.a();

(который также работает из Kotlin .)

Если вам не нравится указывать бит Companion, вы можете либо добавить аннотацию @JvmStatic, либо назвать свой сопутствующий класс.

Из docs :

Объекты Companion

Объявление объекта внутри класса может быть помечено ключевым словом companion:

class MyClass {
   companion object Factory {
       fun create(): MyClass = MyClass()
   }
}

Участники из сопутствующего объекта можно вызвать, просто используя имя класса в качестве определителя:

val instance = MyClass.create()

...

Однако на JVM вы можете создавать члены сопутствующих объектов как реальные статические методы и поля, если вы используете аннотацию @JvmStatic. Подробнее см. Раздел «Интерфейс взаимодействия с Java».

Добавление аннотации @JvmStatic выглядит так:

class Foo {
  companion object {
    @JvmStatic
    fun a() : Int = 1;
  }
}

, а затем оно будет существовать как реальная статическая функция Java , доступный как из Java, так и из Kotlin как Foo.a().

Если это просто не нравится для имени Companion, вы также можете указать явное имя для объекта-компаньона:

class Foo {
  companion object Blah {
    fun a() : Int = 1;
  }
}

, который позволит вам позвонить это от Котлина таким же образом, но от java как Foo.Blah.a() (который также будет работать в Котлине).

406
ответ дан Richa 19 August 2018 в 03:20
поделиться
  • 1
    Это не совсем правильно. Для вызова кода Kotlin из Java будет Foo.Companion.a(), not Foo.a() – pdeva 1 November 2016 в 02:10
  • 2
    @pdeva Я не согласен. Я обновил пример ссылкой на kotlin docs, в котором подробно указано, что он называется точно как Foo.a(). – Michael Anderson 1 November 2016 в 02:47
  • 3
    это вызов из кода Котлина. Прочитайте мой комментарий. Он говорит, что для вызова кода Котлин из кода Java вам необходимо получить доступ к сопутствующему объекту. – pdeva 1 November 2016 в 03:03
  • 4
    @pdeva То, что также описано в документах, и я обновил дополнительную информацию. – Michael Anderson 1 November 2016 в 03:10
  • 5
    В Котлине это будет fun a(): Int { return 1 } или даже fun a(): Int = 1 – Dmitry Zaytsev 17 March 2017 в 10:08
  • 6
    – Muhammad Naderi 31 July 2017 в 04:55
  • 7
  • 8
    – Bagus Aji Santoso 24 August 2017 в 04:25
  • 9
    – Michael Anderson 1 November 2017 в 01:31

Использовать объект для представления val / var / method для статичности. Вы также можете использовать объект вместо Singleton. Вы можете использовать компаньон, если хотите сделать статичным внутри класса

object Abc{
     fun sum(a: Int, b: Int): Int = a + b
    }
12
ответ дан Asharali V U 19 August 2018 в 03:20
поделиться

Вы можете использовать объекты, отличные от сопутствующего объекта

object Utils {
    fun someFunction()
}

. Это будет выглядеть, когда вызывается метод.

Utils.someFunction()
1
ответ дан dr3k 19 August 2018 в 03:20
поделиться

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

Объявление

package foo

fun bar() = {}

Использование

import foo.bar

Альтернативно

import foo.*

Теперь вы можете вызвать функцию с помощью:

bar()

или если вы не используете ключевое слово import:

foo.bar()

Если вы это сделаете не указывать пакет, функция будет доступна из корня.

Если у вас есть только опыт работы с java, это может показаться немного странным. Причина в том, что котлин не является строго объектно-ориентированным языком. Можно сказать, что он поддерживает методы вне классов.

53
ответ дан Henrik F. 19 August 2018 в 03:20
поделиться
  • 1
    Обратите внимание, что под капотом эти «верхний уровень» или "пакет" функции фактически скомпилированы в их собственный класс. В приведенном выше примере компилятор создаст class FooPackage со всеми свойствами и функциями верхнего уровня и соответствующим образом перенаправит все ваши ссылки на них. Дополнительная информация от jetbrains. – Mitchell Tracy 8 December 2017 в 15:59
  • 2
    +1 Для объяснения того, как сделать эквивалентное право в Kotlin , а не только эквивалент зеркала от Java. – phoenix 8 February 2018 в 02:06

Код java выглядит следующим образом:

class Foo { public static int a() { return 1; } }

станет следующим в kotlin:

class Foo { companion object { fun a() : Int = 1 } }

Однако, используя @JvmStatic аннотацию на JVM, мы можем имеют члены сопутствующих объектов, сгенерированных как реальные статические методы и поля.

0
ответ дан Hetvi Gandhi 19 August 2018 в 03:20
поделиться

Записывать их непосредственно в файлы.

В Java (уродливый):

package xxx;
class XxxUtils {
  public static final Yyy xxx(Xxx xxx) { return xxx.xxx(); }
}

В Kotlin:

@file:JvmName("XxxUtils")
package xxx
fun xxx(xxx: Xxx): Yyy = xxx.xxx()

Эти две части кодов равны после компиляции (даже скомпилированное имя файла, file:JvmName используется для управления скомпилированным именем файла, которое должно быть помещено непосредственно перед объявлением имени пакета).

0
ответ дан ice1000 19 August 2018 в 03:20
поделиться
  • 1
    Вы забыли «Котлин (уродливый)» ... KOTLIN: объект-компаньон {val handler = object: Handler (Looper.getMainLooper ()) {] ..... JAVA: static Handler handler = new Handler (Looper.getMainLooper ()) {}; – CmosBattery 14 November 2017 в 16:30
  • 2
    Я думаю, что он действительно не программировал на Java – user25 8 July 2018 в 17:49
[Д0] 1. Определить:

Любой method/ val/ var внутри object (ключевое слово для Singleton) будет действовать как static в java.

Используйте companion object, если вы хотите вызвать метод просто используя класс, содержащий объект.

object Foo{
fun sayFoo() = println("Foo")
val bar ="bar"
}

2. Использование:

Foo.sayFoo()
println(Foo.bar)

3. Выход:

Foo
bar
13
ответ дан Luke35 19 August 2018 в 03:20
поделиться
  • 1
    Если я пытаюсь инициализировать в каком-то другом классе, он дает java.lang.ExceptionInInitializerError и я использую var вместо val – Sudarshan 21 June 2017 в 12:25
  • 2
    Для вызовов методов необходимо иметь ключевое слово INSTANCE, например: Foo.INSTANCE.sayFoo() – Raeglan 16 February 2018 в 13:17
  • 3
    Я думаю, что это решение является предпочтительным способом, если вы хотите static CLASS не просто static methdos. Потому что с объектами-компаньонами вы все равно можете создать экземпляр родительского класса. – fabriciorissetto 23 July 2018 в 18:08

В статическом методе java

public static add(){

}

В статическом методе kotlin

fun add():??? {
}
-3
ответ дан Mogsdad 19 August 2018 в 03:20
поделиться

Все статические члены и функции должны быть внутри сопутствующего блока

  companion object {
    @JvmStatic
    fun main(args: Array<String>) {
    }

    fun staticMethod() {
    }
  }
0
ответ дан Rahul 19 August 2018 в 03:20
поделиться

Вам нужно передать объект-компаньон для статического метода, потому что у kotlin нет статического ключевого слова. Члены сопутствующего объекта можно вызвать, просто используя имя класса в качестве определителя:

package xxx
    class ClassName {
              companion object {
                       fun helloWord(str: String): String {
                            return stringValue
                      }
              }
    }
3
ответ дан Rajesh Dalsaniya 19 August 2018 в 03:20
поделиться

Если вы следуете стилю написания статики в верхней части класса на Java, я предлагаю попытаться рассмотреть возможность записи их на верхнем уровне (например, перед объявлением класса) в Котлине. Для многих случаев использования он работает лучше, чем введение сопутствующего объекта

Пример кода:

class Person {
companion object Test {
    fun callMe() = println("I'm called.")
}


}

fun main(args: Array<String>) { Person.callMe()}

Когда вы запускаете программу, выход будет:

< blockquote>

Я вызван.

0
ответ дан Ranjith Rayapati 19 August 2018 в 03:20
поделиться

Используйте функцию внутри «объекта-компаньона или именованного объекта».

См. пример объекта-компаньона:

   class Foo {
  companion object {
     fun square(x : Int) : Int = x*x
  }
}

См. пример именованного объекта

object Foo{
   fun square(x : Int) : Int = x*x
}

Доступ к нему возможен с помощью

val k = Foo.square(12)
0
ответ дан Sabin ks 19 August 2018 в 03:20
поделиться

Это также сработало для меня

object Bell {
    @JvmStatic
    fun ring() { }
}

из Kotlin

Bell.ring()

из Java

Bell.ring()
0
ответ дан Samuel 19 August 2018 в 03:20
поделиться

Предположим, у вас есть класс Student. И у вас есть один статический метод getUniversityName () & amp; одно поле называется totalStudent.

Вы должны объявить блок сопутствующих объектов внутри вашего класса.

    companion object {
 // define static method & field here.
}

Тогда ваш класс выглядит как

    class Student(var name: String, var city: String, var rollNumber: Double = 0.0) {

    // use companion object structure
    companion object {

        // below method will work as static method
        fun getUniversityName(): String = "MBSTU"

        // below field will work as static field
        var totalStudent = 30
    }
}

. Тогда вы можете использовать эти статические методы и поля, как этот путь.

println("University : " + Student.getUniversityName() + ", Total Student: " + Student.totalStudent)
    // Output:
    // University : MBSTU, Total Student: 30
0
ответ дан Shihab Uddin 19 August 2018 в 03:20
поделиться

У Kotlin нет никакого статического ключевого слова. Вы использовали это для java

 class AppHelper {
        public static int getAge() {
            return 30;
        }
    }

и For Kotlin

class AppHelper {
        companion object {
            fun getAge() : Int = 30
        }
    }

Вызов для Java

AppHelper.getAge();

Вызов для Kotlin

AppHelper.Companion.getAge();

Я думаю, что он работает отлично.

2
ответ дан Shohel Rana 19 August 2018 в 03:20
поделиться

Я хотел бы добавить что-то к приведенным выше ответам.

Да, вы можете определять функции в файлах исходного кода (вне класса). Но лучше, если вы определяете статические функции внутри класса с помощью Companion Object, потому что вы можете добавить больше статических функций, используя расширения Kotlin.

class MyClass {
    companion object { 
        //define static functions here
    } 
}

//Adding new static function
fun MyClass.Companion.newStaticFunction() {
    // ...
}

И вы можете вызывать выше определенную функцию, как вы вызовете любую функцию внутри объекта Companion.

2
ответ дан SVB-knowmywork 19 August 2018 в 03:20
поделиться
object objectName {
    fun funName() {

    }
}
2
ответ дан Umesh Maharjan 19 August 2018 в 03:20
поделиться
  • 1
    Хотя этот фрагмент кода может быть решением, , включая объяснение , действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. – Narendra Jadhav 19 July 2018 в 06:16

создать объект-компаньон и отметить метод с помощью jvmstatic annotation

1
ответ дан user 19 August 2018 в 03:20
поделиться

Вы можете достичь статической функциональности в Kotlin с помощью Companion Objects

  • Добавление компаньона к объявлению объекта позволяет добавлять статические функции к объекту, даже если фактическая статическая концепция не существует в Котлине ,
  • Сопутствующий объект также может обращаться ко всем членам класса, включая частные конструкторы.
  • Объект-компаньон инициализируется при создании экземпляра класса.
  • Объект-компаньон не может быть объявлен вне класса.
    class MyClass{
    
        companion object {
    
            val staticField = "This is an example of static field Object Decleration"
    
            fun getStaticFunction(): String {
                return "This is example of static function for Object Decleration"
            }
    
        }
    }
    

Члены сопутствующего объекта можно вызвать, просто используя имя класса в качестве определителя:

Выход:

MyClass.staticField // This is an example of static field Object Decleration

MyClass.getStaticFunction() : // This is an example of static function for Object Decleration
0
ответ дан Waqar UlHaq 19 August 2018 в 03:20
поделиться

Просто вам нужно создать объект-компаньон и поместить в него функцию

  class UtilClass {
        companion object {
  //        @JvmStatic
            fun repeatIt5Times(str: String): String = str.repeat(5)
        }
    }

Чтобы вызвать метод из класса kotlin:

class KotlinClass{
  fun main(args : Array<String>) { 
    UtilClass.repeatIt5Times("Hello")
  }
}

или Использование import

import Packagename.UtilClass.Companion.repeatIt5Times
class KotlinClass{
  fun main(args : Array<String>) { 
     repeatIt5Times("Hello")
  }
}

Чтобы вызвать метод из класса java:

 class JavaClass{
    public static void main(String [] args){
       UtilClass.Companion.repeatIt5Times("Hello");
    }
 }

или добавив @JvmStatic аннотацию к методу

class JavaClass{
   public static void main(String [] args){
     UtilClass.repeatIt5Times("Hello")
   }
}

или оба путем добавления @JvmStatic аннотации к методу и статического импорта в java

import static Packagename.UtilClass.repeatIt5Times
class JavaClass{
   public static void main(String [] args){
     repeatIt5Times("Hello")
   }
}
1
ответ дан yasincidem 19 August 2018 в 03:20
поделиться

Объекты Companion являются альтернативой ключевому слову java static, и вы можете сделать класс или метод статическими, объявив их как объекты Companion. Вам не нужно квалифицировать объекты-компаньоны с именем класса, если вы вызываете их из одного класса.

Например:

class SomeClass() {

    val id: Int

    init {
       id = nextId++       
    }

    private companion object {
       var nextId = 1
    }
}

fun main(args: Array<String>) {
    repeat(2) { 
        println(SomeClass().id)
    }
} 
1
ответ дан סטנלי גרונן 19 August 2018 в 03:20
поделиться
0
ответ дан Community 30 October 2018 в 15:01
поделиться
2
ответ дан Android Geek 30 October 2018 в 15:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: