Как получить доступ к объекту как статической переменной в KOTLIN - PullRequest
0 голосов
/ 10 октября 2019

Я довольно новичок в kotlin. Я знаю концепции статического члена в Java. Согласно документации, объект работает как статический класс / синглтон, но я не могу получить к ним доступ из своей MainActivity. Из примеров, в kotlin я полагаю, сделать это, как показано ниже, но, похоже, не работает для меня. Я делаю это неправильно? Я хочу использовать объект вместо сопутствующего объекта

TAG.kt

object TAG {
    var MainActivity : String? = null
}

MainActivity.kt

class MainActivity : AppCompatActivity(){  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //Cannot find TAG.MainActivity as static variable like in Java
        TAG.MainActivity = MainActivity::class.java.canonicalName as String
    }
}

Я видел эти сообщения, но не работает Статические переменные в kotlin?

Ответы [ 3 ]

3 голосов
/ 10 октября 2019

Возможно, есть поле / свойство TAG где-то еще в вашем классе? TAG импортирован правильно?

Эта простая программа Kotlin работает без ошибок:

object Obj {
  var Hello = "World"
}

fun main(args: Array<String>) {
  println(Obj.Hello)
}

Отпечатки:

World
2 голосов
/ 10 октября 2019

----------- ОБНОВЛЕННЫЙ ОТВЕТ ----------

ОП хочет иметь объект TAG верхнего уровня. Код OP, представленный в вопросе, на самом деле правильный.
Проблема заключалась в том, что Android Studio OP потребовался перезапуск.

---------- МОЙ ОРИГИНАЛЬНЫЙ ОТВЕТ (но все же хорошо для справки) ----------

Поместить его в объект-компаньон можно.

class MainActivity : AppCompatActivity() {  

    //You can name this object here too (like "companion object shared")
    companion object {
        var TAG: String? = null
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //Notice the ordering here. In fact, you don't even have to type MainActivity. You can just type TAG = ...
        MainActivity.TAG = MainActivity::class.java.canonicalName as String
    }
}
2 голосов
/ 10 октября 2019

Поместите требуемый объект в Сопутствующий объект , тогда как в Kotlin он работает как статический

class MyClassWithStatics {
    companion object {
        const val SOME_CONSTANT = "Hello!"

        @JvmField var someUglyMutableField: String = "don't do this like ever"

        @JvmStatic fun hello() { println("$SOME_CONSTANT $someUglyMutableField") }
    }
}
// consuming Java code!
public class MyOtherClass {
    public void doSomething() {
        String constant = MyClassWithStatics.SOME_CONSTANT;
        String someUglyMutableField = MyClassWithStatics.someUglyMutableField;
        MyClassWithStatics.hello();
    }
}

Также, отметьте это для решения проблемы при доступе к статическому объекту в классе Kotlin https://kotlinlang.org/docs/tutorials/kotlin-for-py/objects-and-companion-objects.html

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