Объявление класса в Java против Kotlin - PullRequest
0 голосов
/ 31 октября 2018

Я новичок в Kotlin , и у меня есть следующие сомнения -

Используя конвертер Java в Kotlin ( this Link ), я преобразовал следующий Java-код в Kotlin .

Java класс:

  public class Person { 
    private String name; 
    private int age; 

    public Person(String name, int age) { 
        this.name = name; 
        this.age = age; 
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    }
  }

Сгенерированный класс Kotlin:

class Person(name:String, age:Int) {
  var name:String
  var age:Int = 0
  init{
    this.name = name
    this.age = age
  }
}

Но я не понимаю, как Java-код и сгенерированный код Котлина эквивалентны, потому что модификаторы видимости членов данных класса изменяются с private (на Java) до public (на Kotlin).

Я полагаю, что если модификаторы видимости сохранятся (члены данных объявлены закрытыми в Kotlin), то в Kotlin должны быть созданы также методы получения и установки, и только тогда они должны быть эквивалентными.

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

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

Фактически ваш код Java с упрощенными методами получения и установки был эквивалентен наличию открытых полей из-за природы методов получения и установки (без проверки и т. Д.).

Если бы ваши установщики сделали, например, нулевые проверки и сгенерировали исключения IllegalArgumentException, код был бы другим.

0 голосов
/ 31 октября 2018

Существуют геттеры, в случае val, сеттеры в случае var. Доступ к полю для чтения или изменения всегда проходит через них. Вы можете заметить их при использовании класса Kotlin из класса Java.

Если геттеры или сеттеры описывают поведение по умолчанию, то указывать их в коде не имеет смысла.

PS: если вы преобразуете свой класс Java в класс Kotlin, вам понравится

class Person(var name: String?, var age: Int)
0 голосов
/ 31 октября 2018

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

Для Котлина class Foo { var bar = 1 }. Чтобы получить к нему доступ через Java, new Foo().bar не компилируется. Вы должны использовать new Foo().getBar(). bar все еще является закрытым членом с getter и setter с точки зрения Java.

Изменяя код Kotlin на class Foo { @JvmField var bar = 1 }, он действительно становится открытым членом в Java. Вы можете получить к нему доступ через Java, используя new Foo().bar

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