Static Imports in Kotlin

  • Antworten:17
  • Bentwortet
Gelöschter Account
  • Forum-Beiträge: 79

26.06.2019, 09:23:28 via Website

Guten Morgen zusammen,

ich versuche mich in letzter Zeit mehr an der App-Programmierung mit Kotlin, bin abe gerade auf etwas gestoßen, dass ich nicht so umsetzen kann, wie ich es gerne hätte:

Wenn ich zum Beispiel in Java so eine Klasse anlege:

public final class TestClass {
    public static final int WERT1 = 1;
    public static final int WERT2 = 2;
}

Dann kann ich jeden der enthaltenen Werte direkt in anderen Klassen verwenden, wenn ich die Klasse dort mit so einem import einfüge:

import static de.rsdevstudio.mytestapp.TestClass.*;

Wenn ich dasselbe aber mit Kotlin probiere,

object TestClass {
    val WERT1 = 1
    val WERT2 = 2
}

dann muss ich in anderen Klassen jede Konstante einzeln importieren:

import de.rsdevstudio.mytestapp.TestClass.WERT1
import de.rsdevstudio.mytestapp.TestClass.WERT2

Weil Kotlin-Klassen auch mit Java-Klassen kompatibel sind, könnte ich die Klasse mit den Konstanten einfach im Java Format lassen und in Kotlin trotzdem den Import mit Sternchen verwenden, aber mir würde es besser gefallen, wenn alles Kotlin ist. :-)

— geändert am 26.06.2019, 09:24:44

Kommentieren
Beste Antwort
swa00
  • Forum-Beiträge: 3.704

26.06.2019, 09:57:51 via Website

Moin ,

zu Kotlin bin ich leider noch nicht gekommen .

Allerdings binde ich niemals so etwas statisch ein, sondern dynamisch als Instanz.
Wenn es dann denn "statisch" sein soll, dann eher in einer übergeordneten Singleton Klasse.

Ich vermute stark, dass das auch Kotlin so will , da es eher konform ist.

Deine Technik kann Dir nämlich recht schnell & bekanntermaßen um die Ohren fliegen.

— geändert am 26.06.2019, 10:09:08

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

26.06.2019, 10:17:07 via Website

Ich kenne Kotlin jetzt nicht so direkt aber kannst du keine Wildcard imports nutzen?
import de.rsdevstudio.mytestapp.TestClass.*

siehe Beispiel:
https://stackoverflow.com/questions/33055189/static-method-imports-in-kotlin

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Gelöschter Account
  • Forum-Beiträge: 79

26.06.2019, 10:25:46 via Website

In diesem stackoverflow Beitrag funktioniert der import mit Wildcard nur, weil Mockito eine Java Klasse ist. Wahrscheinlich ist das auch tatsächlich die einzige Lösung, wenn ich keine ewig lange Liste mit Imports haben will: Die Klasse, die die Konstanten enthält muss wohl Java bleiben. :-/

@swa00:
Wieso sollte einem so eine Implementierung um die Ohren fliegen? Ich hatte bisher nie Probleme damit und ich finde es auf jeden Fall schöner, die Konstanten in eine Extra Klasse zu schreiben, anstatt sie alle zusammen mit dem Programmcode in der Hauptklasse aufzulisten. Das führt dann nur dazu, dass man mehr hin und her scrollen muss. ^^

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

26.06.2019, 11:01:47 via Website

Mit dem Scrollen gebe ich Dir absolut recht .

Dann bist du einer der wenigen Glücklichen , bei denen der LifeCyle / GC noch nicht zugeschlagen hat :-)
Ist mir schön des Öfteren passiert - seit dem keine statischen Allocs mehr unter Android.
Nur noch Singleton .

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

26.06.2019, 12:03:12 via Website

Das companion opject wurde erst etwas später in kotlin eingefügt. Man wolte am Anfang krin static in kotlin haben aus den vom saw00 genannten Gründen. Deshalb hat man glaube in der kotlin Version 1.2 das companion eingeführt.

Hilfreich?
Kommentieren
Gelöschter Account
  • Forum-Beiträge: 79

26.06.2019, 12:16:11 via Website

Hi Jokel,

Gibt es eine Möglichkeit, das Companion-Object in eine eigene Datei zu schreiben? Wenn nicht, dann habe ich ja mit dem Companion-Object auch wieder das Problem, dass es meine Hauptklasse größer macht.

— geändert am 26.06.2019, 12:16:24

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

26.06.2019, 13:40:56 via Website

@Robert ja wie Rafael schon sagte in einer eigenen classe und die auch in eine eigene Datei.

Ist eigentlich aus dem link was ich mit gegeben habe ersichtlich. Im conpanion object können natürlich auch Variablen definiert werden und nicht nur Funktionen. Auf die du auch außerhalb der Klasse zugreifen kannst. Natürlich immer mit dem Klassen Namen davor.

Hilfreich?
Kommentieren
Gelöschter Account
  • Forum-Beiträge: 79

26.06.2019, 18:46:22 via Website

Hmm, dann hilft mir das Companion-Object leider nicht mit meinem Problem weiter. Dann werde ich wohl mit der statischen Java-Klasse in meinem Kotlin Projekt leben müssen, wenn ich nicht alles in eine Datei quetschen will. (silly)

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

26.06.2019, 19:47:14 via Website

Wie so.
Du willst eine eigene Datei in der deine statischen variable definirt werden. Das machst du in Java auch mit einer Klasse in der du die variablen erstellst.

In Kotlin ist das eigentlich gleich.

Eine Klasse mit companion Objekt das Objekt brauch nicht mal einen Namen. Im Objekt erstellst du deine variablen mit val.
Oder auch Methoden die dann natürlich auch static sind.

Aus deiner activity kannst du mit den Klassen Namen und den Namen der variablen darauf zugreifen. Wenn du den Klassen Namen kurtz hälst ist es auch nicht viel svhreibarbeit. In Java ist das das gleiche.

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

26.06.2019, 20:00:37 via Website

class Foo {

companion object {

    var x : Integer
    val Wert1 = 1






}

}

in der activity
Foo.x = 2
val test = Foo.Wert1

— geändert am 26.06.2019, 20:06:20

Hilfreich?
Kommentieren
Gelöschter Account
  • Forum-Beiträge: 79

26.06.2019, 20:20:43 via Website

Ja, aber so will ich es ja wie gesagt nicht machen. Ich will einfach die Konstanten in meiner Hauptklasse verfügbar haben, ohne davor noch extra die andere Klasse hinschreiben zu müssen. So, wie es mit einem Import mit Wildcard funktioniert. ^^

Bei deinem Beispiel kann man sich übrigens das Companion-Object sparen:

object Foo {
    var x: Int
    val Wert1 = 1
}

und dann in der Activity

Foo.x = 2
val test = Foo.Wert1

Das sollte genauso funktionieren, ist aber halt nicht das, was ich will. ;-)

Hilfreich?
Kommentieren
Ludy
  • Admin
  • Forum-Beiträge: 7.959

26.06.2019, 20:33:09 via App

Hallo zusammen,

habe zwar keine Ahnung von Kotlin, aber nen Link - vielleicht hilft das weiter

https://kotlinlang.org/docs/reference/packages.html

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

26.06.2019, 20:33:39 via Website

>
Bei deinem Beispiel kann man sich übrigens das Companion-Object sparen:

Nein das kannst du nicht ohne companion musst du immer den Klassen Namen und den Objekt namen schreiben. Eine statisches object gehört bei kotin immer in eine Klasse. Du willst es ja in einer separaten Datei also klasse haben.
Das companion erspart dir nur das Schreiben des Objekt namen.

Sonst KassenName.ObjektName.variable

Wenn das Objekt in der gleichen classe Datei ist geht das. Wie gesagt wolltest du es i eine eignen Datei und somit auch klasse.

— geändert am 26.06.2019, 21:06:19

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

26.06.2019, 20:37:16 via Website

Ja Ludy den top level Bereich habe ich auch schon vorgeschlagen

Ist nur nicht so java conform wie Objekt ob mit oder ohne companion.

— geändert am 26.06.2019, 20:42:49

Hilfreich?
Kommentieren
Gelöschter Account
  • Forum-Beiträge: 79

27.06.2019, 08:20:47 via Website

Achse, nee, ich meinte nicht, dass man das "companion" einfach weglässt. Die ganze Kotlin-Datei würde wirklich nur das beinhalten:

object Foo {
    var x: Int
    val Wert1 = 1
}

Also im Prinzip eher das "class" durch "object" austauschen. Dann zeigt AndroidStudio sogar im Dateisymbol an, dass es ein Object und keine Class ist. ^^

Hilfreich?
Kommentieren