Kotlin DSL
webforJ tarjoaa Kotlin Domain Specific Language, eli DSL, joka mahdollistaa käyttöliittymien rakentamisen tiiviillä, tyyppiturvallisella syntaksilla. Imperatiivisen Java-koodin sijasta kirjoitat deklaratiivista koodia, joka näyttää kuvaukselta käyttöliittymäsi rakenteesta.
FlexLayout layout = new FlexLayout();
layout.setDirection(FlexDirection.COLUMN);
layout.setSpacing("10px");
TextField name = new TextField();
name.setLabel("Nimi");
name.setPlaceholder("Nimesi");
layout.add(name);
Button submit = new Button("Lähetä", ButtonTheme.PRIMARY);
submit.onClick(e -> handleSubmit());
layout.add(submit);
flexLayout {
direction = FlexDirection.COLUMN
styles["gap"] = "10px"
textField("Nimi", placeholder = "Nimesi")
button("Lähetä", ButtonTheme.PRIMARY) {
onClick { handleSubmit() }
}
}
DSL hyödyntää Kotlinin laajennustoimintoja, vastaanottajalla varustettuja lambda-lausumia ja oletusparametreja luodakseen luonnollisen rakentajasynnin. Komponentit pesiytyvät toisiinsa, konfigurointi tapahtuu lohkoissa, ja kääntäjä havaitsee rakenteelliset virheet ennen suoritusta.
Setup
Erillistä Kotlin-asennusta ei tarvita. Maven hoitaa käännön Kotlin Maven -liitännäisen kautta, joten mikä tahansa projekti, joka jo rakentaa Mavenilla, voi lisätä Kotlin-tuen pelkästään riippuvuus- ja liitännäiskonfiguraatiolla.
Riippuvuudet
Lisää webforJ Kotlin DSL -moduuli ja Kotlinin standardikirjasto pom.xml:ään:
<dependency>
<groupId>com.webforj.kotlin</groupId>
<artifactId>webforj-kotlin</artifactId>
<version>${webforj.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>${kotlin.version}</version>
</dependency>
Jos aiot kirjoittaa testejä Kotlinilla, lisää myös Kotlin testiriippuvuus. Se integroituu JUnitin kanssa:
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test</artifactId>
<version>${kotlin.version}</version>
<scope>test</scope>
</dependency>
Kotlin Maven -liitännäinen
Lisää Kotlin Maven -liitännäinen sekä Kotlin- että Java-lähdekoodin kääntämiseksi. Alla oleva sourceDirs-konfiguraatio mahdollistaa Kotlin- ja Java-tiedostojen olemassaolon samassa projektissa:
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<sourceDirs>
<sourceDir>src/main/java</sourceDir>
<sourceDir>target/generated-sources/annotations</sourceDir>
<sourceDir>src/main/kotlin</sourceDir>
</sourceDirs>
</configuration>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
<configuration>
<sourceDirs>
<sourceDir>src/test/java</sourceDir>
<sourceDir>target/generated-test-sources/test-annotations</sourceDir>
<sourceDir>src/test/kotlin</sourceDir>
</sourceDirs>
</configuration>
</execution>
</executions>
<configuration>
<jvmTarget>${maven.compiler.target}</jvmTarget>
</configuration>
</plugin>
Näiden lisäysten kanssa mvn compile kääntää Kotlin-lähdekoodit yhdessä Javasta. Kotlin-tiedostot voivat olla joko src/main/kotlin- tai src/main/java-kansiossa, ja liitännäinen käsittelee molemmat.
Kotlin kääntyy JVM-bittikoodiksi, joten se toimii olemassa olevien Java-koodien rinnalla. Voit käyttää DSL:n avulla rakennettuja Kotlin-yhdistelmiä Java-luokista, pesiyttää standardi Java -komponentteja DSL-lohkoihin käyttäen add(), ja sekoittaa Kotlin- ja Java-tiedostoja samassa projektissa.
Aiheita
Seuraavat aiheet käsittelevät DSL:n käyttöä sekä sen laajentamista kaikkiin mukautettuihin komponentteihin tai yhdistelmiin, jotka luot.
📄️ Using the DSL
Kotlin DSL tarjoaa rakennusfunktioita webforJ-komponenteille. Jokainen funktio luo komponentin, lisää sen pääsäiliöön ja suorittaa konfiguraatioblokin. Tämä sivu kattaa mallit ja käytännöt, joita käytät rakennettaessa käyttölöitä DSL:llä.
📄️ Extending the DSL
Kotlin DSL on laajennettavissa, ja se mahdollistaa DSL-funktioiden lisäämisen mukautetuille komponenteille tai kolmannen osapuolen kirjastoille. Voit rakentaa yhdistettyjä komponentteja, jotka käyttävät DSL:ää sisäisesti.
Kotlin Java-kehittäjille
Uusi Kotlinin parissa? Tässä ovat joitakin keskeisiä kieliominaisuuksia, joihin DSL perustuu.
Null-turvallisuus
Kotlin erottelee nollattavissa ja ei-nollattavissa tyypeissä käännösaikana:
// Java - mikä tahansa viite voi olla null
String name = null;
// Kotlin - eksplisiittinen null-kyky
var name: String? = null // Nullattavissa, voi olla null
var safeName: String = "arvo" // Ei-null, kääntäjä valvoo tätä
// Turvallinen kutsuoperaattori - palauttaa null, jos name on null
println(name?.length)
// Elvis-operaattori - tarjoaa oletusarvon, kun null
println(name ?: "oletusarvo")
Laajennustoiminnot
Kotlinissa voit lisätä metodeja olemassa oleviin luokkiin ilman perintää:
// Java-lähestymistapa - staattinen utiliteettiklussi
public class StringUtils {
public static String addExclamation(String input) {
return input + "!";
}
}
String result = StringUtils.addExclamation("Hello");
// Kotlin-lähestymistapa - laajennustoiminto
fun String.addExclamation(): String = this + "!"
val result = "Hello".addExclamation() // Lukee kuin metodikutsu
DSL käyttää laajennustoimintoja rakenteiden lisäämiseen komponentteihin.
Lambdat ja jälkimmäinen lambda-syntaksi
Kotlinin lambdat ovat tiiviimpiä kuin Javassa, ja kun lambda on viimeinen parametri, se voi olla ulkopuolella sulkujen:
// Java
button.addClickListener(e -> System.out.println("Klikattu"));
// Kotlin - lambda viimeisenä parametrina menee sulkujen ulkopuolelle
button.onClick { println("Klikattu") }
// Ilman eksplisiittistä parametria
button.onClick { event -> println("Klikattu: $event") }
Tämä jälkimmäinen lambda-syntaksi mahdollistaa DSL-lohkot.
Oletusparametrit
Kotlin-funktioilla voi olla oletusarvot parametreille, mikä vähentää ylikuormitettujen metodien tarvetta:
// Java - useita konstruktoreita tarvitaan
public Button() {}
public Button(String text) {}
public Button(String text, ButtonTheme theme) {}
// Kotlin - yksi funktio oletusarvoilla
fun button(
text: String = "",
theme: ButtonTheme = ButtonTheme.DEFAULT,
block: Button.() -> Unit = {}
): Button