Рубрики
Без рубрики

Совместимость между Java и Kotlin

Узнайте о совместимости между Java и Kotlin в этой статье Абида Хана, разработчика приложений и инженера-тестировщика с более чем 10-летним опытом, и Игоря Кучеренко, Android…

Автор оригинала: PACKT.

Узнайте о совместимости между Java и Kotlin в этой статье Абида Хана, разработчика приложений и инженера-тестировщика с более чем 10-летним опытом, и Игоря Кучеренко, разработчика Android в Techery, компании по разработке программного обеспечения, которая использует Kotlin в качестве основного языка для разработки Android.

Совместимость

Совместимость означает возможность использования языков Java и Kotlin в одном проекте. Вы можете вызывать функции Kotlin на Java, а также методы и переменные Java в коде Kotlin. Это дает вам преимущество в возможности повторного использования кода. Например, если у вас есть существующий проект Java с классами и функциями, то вам не нужно переписывать все в Kotlin с нуля. Вместо этого вы можете использовать каждую строку Java-кода в Kotlin и начать писать новые функции здесь. Аналогично, вы можете вызвать код Kotlin на Java.

Вы начнете с вызова статических переменных и функций Java в Kotlin, затем перейдете к коллекциям Java и изучите некоторые примеры вызова классов Java в Kotlin. Затем вы увидите, как обрабатывать резервные слова Kotlin и использовать написанный на Java код Kotlin с переменными, функциями, функциями расширения и классом Kotlin. Вы также увидите замену имен файлов и имен функций Kotlin с помощью аннотации JVM, предоставленной Kotlin. Наконец, вы быстро взглянете на то, как вызывать класс объектов Котлина на Java.

Технические требования

Кроме IntelliJ IDEA, эта статья не требует каких-либо специальных установок. Код для этой статьи можно загрузить из репозитория GitHub: https://github.com/PacktPublishing/Hands-On-Object-Oriented-Programming-with-Kotlin/tree/master/src/main/kotlin/Chapter08 .

Вызов Java – кода в Котлине

В этом разделе вы узнаете, как использовать Java-код в файле Kotlin. Для простоты начните с создания пакета и добавления файлов Java и Kotlin в одном месте, так как вы знаете, что Kotlin позволяет хранить файлы Java и Kotlin в одном проекте. Итак, у вас есть два класса Java, называемые Call Java и Shape, и в той же папке у вас есть один файл Kotlin, вызванный из Kotlin:

Итак, у вас есть два класса Java, называемые Call Java и Shape, и в той же папке у вас есть один файл Kotlin, вызванный из Kotlin:

Начните со статической переменной и функции Java.

Вызов статических переменных и функций

Откройте файл Java вызова и добавьте одно сообщение статической переменной: общедоступная статическая строка; Включите один статический метод add, который добавляет две переменные и выводит сообщение на экран:

public static void add(int i, int j){
    System.out.println(i + " + " + j + "=" + (i + j));
}

Вызов статической функции или переменной из Java в Kotlin очень прост. Для этого используйте имя файла Java в качестве ссылки и вызовите требуемую функцию или переменную. Посмотрите на следующий пример Kotlin, чтобы вызвать статическую переменную Java:

fun callStaticFromJava() {
    var message = CallJava.message
    println("Java Message : ${message}")

    CallJava.add(4,5)
}

Чтобы вызвать статическую переменную, используйте имя класса Java в качестве ссылки вместе с именем переменной Call Java.message. Это значение может быть присвоено локальной переменной и использоваться как обычная переменная Котлина. Аналогично, вызовите статическую функцию Java, используя имя класса в качестве ссылки вместе с именем функции. Вызовите метод add из Java с помощью вызова Java.add(4,5) и передайте две целочисленные переменные в качестве параметров.

Вызов коллекции Java в Kotlin Создайте метод в Java, который возвращает массив целых чисел:

public static ArrayList getIntList(){

    ArrayList integers = new ArrayList<>();
    integers.add(1);integers.add(2);integers.add(3);

return integers;
}

getIntList возвращает массив, содержащий три элемента. Вызовите эту функцию в Kotlin, чтобы получить доступ к списку и добавить в него дополнительные элементы:

var list = CallJava.getIntList()
//var list: ArrayList = CallJava.getIntList()

list.add(4)
for (element in list) {
println("Element $element")
}

Вызов Java.getIntList() возвращает ArrayList, который может быть назначен переменным типа списка. Вы можете явно объявить тип списка, используя имя ArrayList:

var list: ArrayList = CallJava.getIntList()

В качестве альтернативы вы можете напрямую назначить список переменной, и Kotlin сам определит тип списка:

var list = CallJava.getIntList()

Вы можете рассматривать это как обычный неизменяемый список и добавлять или удалять элементы.

Зарезервируйте слова в Котлине Существует ряд ключевых слов, которые используются Kotlin для своих внутренних целей, и они не могут использоваться в качестве имен переменных и объявлений функций. Некоторые из резервных слов заключаются в следующем:

in, is, as, object, val, var, for, fun, interface, when 

Существуют резервные слова, которые Котлин зарезервировал для себя, но когда дело доходит до Java, большинство зарезервированных ключевых слов Котлина являются обычными переменными для Java. См. Следующий пример:

public static void is(){
    System.out.println("is is a reserved keyword in Kotlin :-) ");

}

public static void var(){
    System.out.println("var is a reserved keyword in Kotlin :-) ");
} 

var и is-обычные ключевые слова для Java, но не для Kotlin. Если вам нужно вызвать функцию с зарезервированными словами Котлина, вам нужно использовать оператор обратного отсчета. См. Следующий пример Котлина:

CallJava.`is`()
CallJava.`var`()

Используйте оператор backtick (`) для вызова функций Java, имена которых являются зарезервированными ключевыми словами для Kotlin. Вот еще несколько примеров, чтобы узнать, как использовать функции Java, имена которых содержат зарезервированные ключевые слова Kotlin.

Напишите функцию в Kotlin, которая принимает входные данные от пользователя и отображает сообщение на экране. Котлин использует класс сканера, предоставляемый Java, для ввода с клавиатуры, как показано ниже:

fun inputFromKeyboard() {
println("Enter Your name .... ")
val scanner = Scanner(System.`in`)
println("My name is ${scanner.nextLine()}")
}

Класс сканера занимает System.in в качестве входного потока для сканирования входных данных. Как вы можете видеть, in-это зарезервированное ключевое слово но вы можете использовать это с помощью оператора backticks. Аналогичным образом, вы можете использовать все зарезервированные ключевые слова в качестве имени функции или переменной таким образом:

fun `in`(){
println("I am in function")
}

fun `as`(){
println("I am as function")
}

fun `object`(){
println("I am object function")
}  

var `var` = "Reserved keyword var"
var `object` = "Reserved keyword object"

Классы Java в Котлине

Теперь изучите, как создать объект класса Java в Kotlin. Для этого создайте Shape.java файл с тремя свойствами: высота, ширина и имя с геттерами и сеттерами:

public class Shape {

private int width;
private int height;
public static final double PI = 3.1415;
private final String name;

public Shape(int width, int height, String name) {
this.width = width;
this.height = height;
this.name = name;
    }
public final int getHeight() {
return this.height;
    }

public final void setHeight(int value) {
this.height = value;
    }

public final String getName() {
return this.name;
    }
public final void shapeMessage() {
        System.out.println("Hi i am " + this.name + ", how are you doing");
    }
}

Создание экземпляра класса Java в Kotlin аналогично созданию экземпляра класса Kotlin. См. Следующий пример:

val shape = Shape(5,10,"Square")

shape-это экземпляр класса Shape, который может получать доступ к функциям и обновлять свойства класса:

shape.shapeMessage()
shape.height = 10
println("name ${shape.name} height = ${shape.height}")

Вызов кода Kotlin на Java Вызов кода Kotlin на Java аналогичен вызову кода Java в Kotlin, за исключением нескольких вещей, которые необходимо учитывать перед началом. Начните с вызова функции. Для этого создайте новую папку и добавьте файлы Java и Kotlin в одном месте:

Для этого создайте новую папку и добавьте файлы Java и Kotlin в одном месте:

Вызов функции Kotlin

Теперь создайте две функции в Kotlin, добавьте и добавьте И Верните. Функция add берет две целочисленные переменные, добавляет их и выводит на экран, в то время как addAndReturn добавляет два значения и возвращает результат:

fun add(a : Int, b : Int) {
println("Result of $a + $b is ${a+b}")
}


fun addAndReturn(i: Int, j: Int): Int {
return i + j
}

Вы можете вызывать каждую функцию Kotlin, используя имя файла в качестве ссылки. Вызов Kotlin.kt-это файл, содержащий функцию Kotlin. При вызове функции Kotlin в файле Java важно помнить, что для вызова нужной функции необходимо добавить ключевое слово kt с именем файла Kotlin. Например, вы можете вызвать функцию добавления с помощью CallKotlinKt.add. См. Следующий пример файла Java:

public static void main(String args[]) {

    CallKotlinKt.add(5,5);

int result = CallKotlinKt.addAndReturn(5,5);
    System.out.print("From Kotlin: result = " + result);

}

Выполните этот код, и он отобразит следующий вывод:

Result of 5 + 5 is 10
From Kotlin: result = 10

Функции расширения

Также можно вызвать функцию расширения Kotlin в Java. В Kotlin создайте функцию расширения, которая принимает один параметр, умножает значение на 2 и возвращает результат. Смотрите следующую функцию расширения Kotlin:

fun Int.doubleTheValue() = this * 2

Создайте эту функцию расширения в классе Kotlin и вызовите эту функцию в основную функцию Java, используя функцию CallKotlinKt.doubleTheValue. См. Следующий пример:

public static void main(String args[]) {
int i = 5;
int result = CallKotlinKt.doubleTheValue(i);
    System.out.print("Kotlin's Extension function, Multiply "+ i +" with 2 = "+ result);
}

В результате результат будет таким, как ожидалось:

Kotlin's Extension function, Multiply 5 with 2 = 10

Функции с изменяемыми коллекциями

Создайте изменяемый список в функции getMutableList и верните список следующим образом:

fun getMutableList() : MutableList {
val list = mutableListOf(1,2,3,4,5)
return list
}

Создайте список из переменной Kotlin в Java и назначьте список этой переменной с помощью функции CallKotlinKt.getMutableList из Kotlin. См. Следующий пример:

public static void main(String args[]) {

    System.out.print("Kotlin mutable list");
//List listFromKotlin = KotlinToJavaKt.mutableList();

List listFromKotlin = CallKotlinKt.getMutableList();
    listFromKotlin.add(6);
for (int i = 0; i < listFromKotlin.size(); i++) {
        System.out.println("Element " +  listFromKotlin.get(i));
    } 
}

Обратите внимание, что Котлин не знаком с примитивными типами данных. В результате вы должны предоставить список целых классов:

//List listFromKotlin = KotlinToJavaKt.mutableList(); // list of int
List listFromKotlin = CallKotlinKt.getMutableList(); // List of Integers

Функции с неизменяемыми коллекциями

Теперь посмотрите, как получить неизменяемый список из функции Kotlin в Java. Создайте неизменяемый список в функции getImmutableList и верните список:

fun getImmutableList() : List {
val list = listOf(1,2,3,4,5)
return list
}

Получите список Kotlin, вызвав функцию get ImmutableList и отобразив элементы списка. См. Следующий пример:

public static void main(String args[]) {
    System.out.println("Kotlin immutable list");

    List listFromKotlin = CallKotlinKt.getImmutableList();

for (int i = 0; i < listFromKotlin.size(); i++) {
        System.out.println("Element " +  listFromKotlin.get(i));
    }
}

Поскольку вы знаете, что неизменяемый список не может быть обновлен, вы можете прочитать список, но не можете добавлять или обновлять элементы. Как только неизменяемый список вызывается в Java, программист несет ответственность за проверку типа списка перед его обновлением, поскольку компилятор Java не смог уловить ошибку во время компиляции. Если вы попытаетесь добавить элемент в неизменяемый список Kotlin, вы получите следующий результат:

List listFromKotlin = KotlinToJavaKt.getImmutableList();
listFromKotlin.add(6);

Это показывает, что Java выбросит java.lang. Исключение UnsupportedOperationException во время выполнения, и приложение завершит работу.

Функции с аннотацией JVM

Вы можете вызвать функцию Kotlin на Java, используя имя файла в качестве ссылки. Вам также необходимо добавить ключевое слово kt с именем файла; например, KotlinToJavakt. Тем не менее, Kotlin позволяет присваивать различные имена вашим именам файлов и функций. Создайте новый класс с именем CallKotlinUtil.kt и добавьте следующий код:

@file:JvmName("KotlinUtil")
package Chapter08.CallKotlinFromJava

fun addition (a: Int, b : Int){

println("Result of $a + $b is ${a+b}")

}

Используйте аннотацию @file:Имя Jvm(“Kotlin Util”) в начале файла. Теперь вы можете вызвать функцию добавления, используя Kotlin Util.addition вместо CallKotlinUtilkt.addition. См. Следующий пример:

public static void main(String args[]) {
    KotlinUtil.addition(4,4);
}

Это гораздо лучший и более чистый подход. Теперь вы можете указать имя файла Kotlin для класса Java, которое будет использоваться в качестве ссылки. Kotlin также позволяет указать имя функции Kotlin для Java. Создайте функцию добавления в файле Kotlin и добавьте аннотацию @JvmName с новым именем функции следующим образом:

@file:JvmName("KotlinUtil")
package CallKotlinFromJavaPackage

@JvmName ("addDouble")
fun addition (a: Double, b : Double){
println("Result of $a + $b is ${a+b}")
}

Теперь вы можете вызвать функцию сложения с помощью add Double. См. Следующий пример:

public static void main(String args[]) {
    KotlinUtil.addDouble(5.0, 5.0);
}

Вызов класса Kotlin

В этом разделе вы увидите, как вызвать класс Kotlin на Java. Создайте класс формы в Kotlin с тремя свойствами, высотой, шириной и площадью, а также двумя функциями: сообщение формы и рисование:

class Shape(var width : Int, var height : Int , val shape: String) {

var area : Int = 0
fun shapeMessage(){
println("Hi i am $shape, how are you doing")
    }
fun draw() {
println("$shape is drawn")
    }

fun calculateArea(): Int {
area = width * height
return area
}
}

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

class FromKotlinClass {

public void callShpaeInstance() 
    {
        Shape shape = new Shape(5,5,"Square");

        shape.shapeMessage();
        shape.setHeight(10);
        System.out.println(shape.getShape() + " width " + shape.getWidth());
        System.out.println(shape.getShape() + " height " + shape.getHeight());
        System.out.println(shape.getShape() + " area " + shape.calculateArea());

        shape.draw();
    }
}

Создайте экземпляр фигуры, добавив параметры конструктора. Вы можете использовать экземпляр shape для доступа ко всем свойствам класса с помощью методов getter и setter. Вы также можете вызвать сообщение shape или нарисовать функции класса Shape, используя экземпляр shape.

Вызов на горячую линию синглтон-класса

Вы также можете вызвать класс singleton горячей линии на Java. Создайте одноэлементный класс в Kotlin, используя ключевое слово object:

object Singleton {
fun happy() { 
println("I am Happy")
    }
}

Кроме того, вызовите класс Singleton и функцию happy в Java, используя ключевое слово INSTANCE:

public static void main(String args[]) {
    Singleton.INSTANCE.happy();
}

Обратите внимание, что вам не нужно использовать имя файла Kotlin в качестве ссылки, но достаточно имени класса объектов Singleton. Вы также можете пропустить ключевое слово ЭКЗЕМПЛЯРА. Добавьте аннотацию @JvmStatic в начале подписи функции:

object Singleton {

fun happy() {
println("I am Happy")
    }

@JvmStatic fun excited() {
println("I am very Excited")
    }
}

Как только это будет сделано, вызовите функцию excited напрямую, не используя ключевое слово INSTANCE в Java:

public static void main(String args[]) {
    Singleton.INSTANCE.happy();
    Singleton.excited();
}

Выполните программу Java и проверьте вывод, как показано ниже:

I am Happy
I am very Excited

Если вы нашли эту статью интересной, вы можете изучить Практическое объектно-ориентированное программирование с помощью Kotlin , чтобы узнать все, что вам нужно знать об объектно-ориентированном программировании с использованием новейших функций Kotlin 1.3. Практическое объектно-ориентированное программирование с помощью Kotlin дает вам полное представление о концепциях программирования, методах объектно-ориентированного программирования и шаблонах проектирования.

Оригинал: “https://www.codementor.io/@packt/interoperability-between-java-and-kotlin-rifmhfip0”