Простой пример класса с сопутствующим объектом

class MyClass{
  companion object{
     val test = 25
  }
}

Доступ к тесту значения возможен из MyClass.test, но как получить доступ из экземпляр MyClass? Если у меня есть val sample = MyClass(), как мне получить доступ к тесту из образца? sample::class.test не правильно .... есть ли способ?

Был задан вопрос: «Почему бы просто не использовать MyClass.test»?

Я предпочитаю оставить вопрос «как», а не «почему», но, поскольку его спросили, я попробую «почему». То же самое относится и к методам. Почему бы не иметь статические функции в классе и просто вызвать Class.function () и передать объект в качестве одного из параметров?

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

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

Мое решение до сих пор состоит в том, чтобы просто реализовать эквивалент MyClass в качестве теста в качестве статического

public class MyClass {
    static Integer test = 25;
    public Integer testGetter(){ return test;}

}

Есть простые решения для этого в Java, C ++, Python и т. Д. (Я предоставлю примеры кода для каждого, который помогает), и я думаю, что в kotlin будет лучшее решение, чем использование Java.

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

14
innov8 19 Окт 2017 в 12:44

3 ответа

Лучший ответ

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

class MyClass{
  companion object{
     val test = 25
  }
  var staticTest get() = test  // getter for test
}

Тогда все, что нужно для доступа, это:

sample.staticTest

Или вы можете предоставить доступ к объекту-компаньону ...

class MyClass{
    companion object{
        val test = 25
    }
    var companion = Companion
}

Затем разрешить полный доступ ко всему в компаньоне

4
innov8 21 Авг 2018 в 00:26

Это еще один способ использовать статическую переменную в kotlin следующим образом.

object AppConstant {
const val baseUrl : String = ""
const val KEY_PRODUCT_ITEM="productItem"
}

Когда доступ в любом месте в проекте, как это ..

AppConstant.KEY_PRODUCT_ITEM

Другой мудрый импорт AppConstant. тогда использовал только KEY_PRODUCT_ITEM

2
Android Team 21 Авг 2018 в 06:16

Используя рефлексию, вы можете пройти через companionObject:

sample::class.companionObject?.memberProperties?.find { it.name == "test" }
4
s1m0nw1 19 Окт 2017 в 09:58