Jak zdefiniujesz statyczną metodę rozszerzenia w Kotlinie? Czy to w ogóle możliwe? Obecnie mam metodę rozszerzenia, jak pokazano poniżej.
public fun Uber.doMagic(context: Context) {
// ...
}
Powyższe rozszerzenie można wywołać w instancji.
uberInstance.doMagic(context) // Instance method
ale jak zrobić to statyczną metodą, jak pokazano poniżej.
Uber.doMagic(context) // Static or class method
static-methods
kotlin
Ragunath Jawahar
źródło
źródło
Odpowiedzi:
Aby osiągnąć
Uber.doMagic(context)
, można napisać rozszerzenie do obiektu towarzysz zUber
(wymagane jest zgłoszenie obiektu towarzysz):źródło
Oto, co mówi oficjalna dokumentacja:
Metody statyczne Kotlina
źródło
Właściwie to miałem dokładnie to pytanie 30 minut temu, więc zacząłem kopać i nie mogłem znaleźć żadnego rozwiązania ani obejścia tego problemu, ALE podczas wyszukiwania znalazłem tę sekcję na stronie Kotlinglang, która stwierdza, że:
Więc wtedy wpadłem na najbardziej szalony pomysł, dlaczego nie zdefiniować funkcji rozszerzającej z odbiornikiem dopuszczającym wartość null (bez faktycznego używania tego odbiornika), a następnie wywołać ją na obiekcie zerowym! Spróbowałem tego i działało całkiem nieźle, ale wyglądało tak brzydko. To było tak:
Więc obejrzałem to, tworząc w moim pliku rozszerzeń wartość typu odbiornika, która miała wartość null, a następnie użyłem jej w mojej innej klasie. Oto przykład, jak zaimplementowałem „statyczną” funkcję rozszerzenia dla
Navigation
klasy w systemie Android: W moim pliku NavigationExtensions.kt:W kodzie, który go używa:
Oczywiście nie jest to nazwa klasy, to po prostu zmienna typu klasy, która ma wartość null. Jest to oczywiście brzydkie po stronie kreatora rozszerzeń (ponieważ muszą utworzyć zmienną) i po stronie programisty (ponieważ muszą używać
SType
formatu zamiast rzeczywistej nazwy klasy), ale jest to najbliższe, co można teraz osiągnąć w porównaniu z rzeczywistymi funkcjami statycznymi. Miejmy nadzieję, że twórcy języka Kotlin odpowiedzą na powstały problem i dodadzą tę funkcję do języka.źródło
Możesz stworzyć metodę statyczną za pomocą obiektu Companion, takiego jak:
a potem możesz to nazwać tak:
źródło
platformStatic
adnotacji.platformStatic
został przemianowanyJvmStatic
w obecnym Kotlinie.Polecam spojrzeć na ten link. Jak widzisz, powinieneś po prostu zadeklarować metodę na najwyższym poziomie pakietu (pliku):
To jest równe
W przypadku constans wszystko jest takie samo. Ta deklaracja
jest równe
źródło
Bardzo lubię również możliwość dodawania statycznych metod rozszerzających w Kotlinie. Aby obejść ten problem, dodaję metodę rozszerzenia do wielu klas, zamiast używać jednej statycznej metody rozszerzającej we wszystkich.
źródło
Activity.isDeviceOnline(...)
bez wystąpieniaActivity
.Aby utworzyć metodę rozszerzenia w kotlin, musisz utworzyć plik kotlin (nie klasę), a następnie zadeklarować swoją metodę w pliku Np .:
Zaimportuj funkcję z klasy lub pliku, nad którym pracujesz, i użyj jej.
źródło