Dzisiaj brniemy dalej z wątkiem dotyczącym klas w Kotlinie. To, co zobaczyliście w poprzednim artykule jest przedsmakiem tego, czego będziecie świadkami w kolejnych rozdziałach. Temat dzisiejszego wywodu to blok inicjalizatora, czyli słowo kluczowe "init" w języku Kotlin. Wygląda bardzo podobnie do inicjalizatora statycznego w Javie, aczkolwiek ma bardziej użyteczne zastosowanie i NIE JEST tym samym.

"INIT" W JĘZYKU KOTLIN KOLEJNYM INNOWACYJNYM SŁOWEM

Nie wysilajcie szarych komórek, drodzy programiści Javy. Nie ma takiego słowa w całym języku. Rozpoczniemy teraz od drugiej strony, czyli najpierw kod w Kotlinie, a potem "odpowiednik" w Javie.

ZASTOSOWANIE I SPOSÓB UŻYCIA

"init" pozwala na wstawienie bloku instrukcji wykonywanego zaraz po utworzeniu obiektu, przy czym nie wolno Wam tego utożsamiać z konstruktorem (to są dwie różne deklaracje)! Może on istnieć wyłącznie w obrębie klasy. Na początek przyjrzyjmy się składni, a potem przedstawię szczegóły:

class MyClass()
{
	init
	{
		println("Utworzono nowy obiekt przy użyciu klasy \"MyClass\"!")
	}
}

Nikt Wam nie zabroni wstawiania wartości dla zmiennych ze słówkiem "var":

class MyClass()
{
	var x = 0
	
	init
	{
		println("Utworzono nowy obiekt przy użyciu klasy \"MyClass\"!")
		
		x = 7
	}
}

A teraz "init" w języku Kotlin kontra Java:

public class MyClass
{
	public int x = 0;
	
	public MyClass()
	{
		System.out.println("Utworzono nowy obiekt przy użyciu klasy \"MyClass\"!");
		
		x = 7;
	}
}

Jak widzicie, blok inicjalizatora to jest nic innego jak ciało konstruktora w Javie, tylko pozbawione możliwości wprowadzania parametrów formalnych. Podejrzewam, że to "rozczłonkowanie" parametrów od bloku kodu powstało z tego powodu, żeby nie musieć wymuszać na człowieku wstawiania tego bloku, jeśli okaże się on niepotrzebny i zostanie stworzony tylko w celu nałożenia obowiązku wprowadzania serii parametrów do obiektu. Poza tym, nie zapominajcie o tym, że każdy taki blok w Javie wymagałby określenia nowej serii parametrów, bo w ten sposób tworzymy nowy konstruktor. Na koniec wywodu taki drobiazg, że bloki inicjalizatora wywołują się dopiero po konstruktorze podstawowym (w nawiasach, po nazwie klasy), o ile on został zdefiniowany.

Teraz będzie ciekawiej. "init" w języku Kotlin nie musi się wcale kończyć na pojedynczej sztuce. Co powiecie na to:

class MyClass()
{
	var x = 0
	
	init
	{
		println("Utworzono nowy obiekt przy użyciu klasy \"MyClass\"!")
		
		x = 7
	}
	
	init
	{
		println("To drugi blok inicjalizatora.")
	}
}

W sytuacji powyżej, jeśli mamy dwa lub więcej bloków inicjalizatora, to zawsze wykonują się w kolejności z góry na dół. "init" w języku Kotlin zachowuje się tak samo, jak cała reszta kodu. Najpierw wykona się ten umieszczony na samej górze, potem ten "stojący" zaraz po pierwszym i tak dalej.

Macie pełne prawo do separowania ich od siebie wstawiając dane składowe klasy:

class MyClass()
{
	var x = 0
	
	init
	{
		println("Utworzono nowy obiekt przy użyciu klasy \"MyClass\"!")
		
		x = 7
	}

	var y = 0
	
	init
	{
		println("To drugi blok inicjalizatora.")
	}
}

Może to wygląda...nienaturalnie, natomiast z czasem będzie to dla Was, drodzy koledzy "od Javy" (oraz cała reszta czytelników), tak samo normalne jak obchodzenie się z klasami w języku Java.

Blok inicjalizatora w języku Kotlin

Blok inicjalizatora wywoływany przy pomocy słowa kluczowego "init", wykonuje szereg określonych instrukcji ZARAZ po konstruktorze podstawowym. Dozwolone jest wstawianie wielu takich bloków naraz.


To już wszystko na temat "init" w języku Kotlin. Nic strasznego, tylko czeka Was ewentualne przestawienie się na inną składnię. Kotlin rządzi się swoimi prawami na wielu płaszczyznach więc radzę Wam zacząć się przyzwyczajać już teraz. Im wcześniej, tym lepiej. Dla Was.

PODOBNE ARTYKUŁY