Co jsou 'context receivers' a jak fungují v Kotlinu?
sobes.tech AI
Odpověď od AI
Příjemci kontextu jsou experimentální funkcí Kotlinu, která umožňuje funkcím, vlastnostem nebo třídám požadovat přítomnost instancí určitých typů v rámci volání. Tento mechanismus umožňuje implicitní předávání závislostí.
Jak fungují:
-
Deklarace: Přidávají se k deklaraci člena pomocí syntaxe
context(...) before ....// Deklarace funkce, která vyžaduje kontext typu Logger a Analytics context(Logger, Analytics) fun processData(data: String) { // Může používat Logger a Analytics bez jejich explicitního předání log("Zpracování dat: $data") trackEvent("DataProcessed", mapOf("size" to data.length)) } class Logger { fun log(message: String) { println(message) } } class Analytics { fun trackEvent(name: String, params: Map<String, Any>) { println("$name: $params") } } -
Volání: Aby bylo možné volat funkci s kontextovými příjemci, musí být v rámci volání dostupné instance požadovaných typů. Toho lze dosáhnout několika způsoby:
- Explicitním vytvořením instancí.
- Mít instance jako kontextové příjemce ve vnějších funkcích nebo třídách.
- Použitím
withnebo jiných scope pro poskytnutí kontextu.
fun main() { // Vytvoření potřebných instancí kontextu val myLogger = Logger() val myAnalytics = Analytics() // Poskytnutí kontextů pomocí with with(myLogger) { with(myAnalytics) { // V tomto scope jsou myLogger a myAnalytics dostupné jako kontexty processData("nějaká důležitá data") } } } -
Vnitřní přístup: Uvnitř člena deklarovaného s kontextovými příjemci jsou instance těchto typů dostupné přímo, jako by to byli příjemci nebo proměnné v rámci scope.
Výhody:
- Snížení boilerplate: Odstraňuje potřebu explicitně předávat společné závislosti přes parametry funkcí.
- Zlepšení čitelnosti: Umožňuje soustředit se na obchodní logiku, nikoli na předávání infrastrukturních závislostí.
- Zapouzdření: Jasně ukazuje, jaké kontexty jsou potřebné k vykonání úkolu člena.
Je důležité poznamenat, že context receivers jsou stále experimentální funkcí a mohou se změnit v budoucích verzích Kotlinu.