Groovy: Nyalakan Steroid

PEMBARUAN: Posting ini mengalami pembaruan yang signifikan pada 17 November 2016 untuk memperbaiki pernyataan dan contoh yang salah, untuk memperbaiki tata letak HTML yang mendasarinya (tidak jelas bagi pembaca kecuali Anda melihat sumber HTML di browser web), dan untuk memperbaiki beberapa masalah ejaan. Jika karena alasan tertentu Anda ingin melihat posting yang lama dan salah, periksa versi yang diarsipkan oleh Wayback Machine.

Saya telah membuat blog sebelumnya tentang dukungan Groovy untuk mengaktifkan String. Groovy dapat mengaktifkan lebih dari sekadar literal String(dan tipe integral literal yang diizinkan oleh Java) dan saya menunjukkan ini secara singkat di sini.

switchPernyataan Groovy akan menggunakan metode yang diimplementasikan dengan nama " isCase" untuk menentukan apakah switchopsi tertentu cocok. Artinya, objek khusus "dapat dialihkan" di Groovy. Untuk contoh sederhana dalam posting blog ini, saya akan menggunakan kelas Java SimpleStatedan State.java.

Daftar 1. SimpleState.java

 package dustin.examples; import static java.lang.System.out; /** * Java class to be used in demonstrating the "switch on steroids" in Groovy. * The Groovy script will be able to {@code switch} on instances of this class * via the implicit invocation of {@code toString()} if the {@code case} * statements use {@code String}s as the items to match. */ public class SimpleState { private String stateName; public SimpleState(final String newStateName) { this.stateName = newStateName; } @Override public String toString() { return this.stateName; } } 

StringRepresentasi kelas Java di atas dapat diaktifkan dalam skrip Groovy seperti yang ditunjukkan dalam daftar kode berikutnya untuk switchOnSimpleState.groovy:

Daftar 2. switchOnSimpleState.groovy

#!/usr/bin/env groovy import dustin.examples.SimpleState SimpleState state = new SimpleState("Colorado") print "The motto for the state of ${state.stateName} is '" switch (state) { case "Alabama": print "Audemus jura nostra defendere" break case "Alaska": print "North to the future" break case "Arizona": print "Ditat Deus" break case "Arkansas": print "Regnat populus" break case "California": print "Eureka" break case "Colorado": print "Nil sine numine" break case "Connecticut": print "Qui transtulit sustinet" break default : print "<>" } println "'" 

Ketika skrip Groovy di atas dijalankan terhadap kelas Java sederhana di atas, kode mencetak informasi yang benar karena Groovy secara implisit memanggil toString()metode pada contoh "status" yang Statesedang diaktifkan. Fungsionalitas serupa sekarang dapat dicapai di Java, tetapi seseorang perlu secara eksplisit memanggil toString()objek yang sedang diaktifkan. Perlu juga diingat bahwa ketika saya menulis versi asli dari posting ini pada awal 2010, Java tidak mendukung pengaktifan Strings. Keluaran dari menjalankan di atas ditunjukkan pada cuplikan layar di bawah (nama skrip tidak cocok di atas karena ini adalah cuplikan layar lama dari posting asli ini sebelum diperbaiki dan diperbarui).

Dengan Groovy dan isCasemetodenya, saya dapat mengaktifkan hampir semua tipe data yang saya suka. Untuk mendemonstrasikan ini, kelas Java Stateakan digunakan dan daftar kodenya ditampilkan di bawah ini. Ini mencakup isCase(State)metode yang secara implisit akan dipanggil Groovy ketika instance Statesedang dialihkan sebagai casepilihan. Dalam kasus ini, isCase(State)metode hanya memanggil State.equals(Object)metode untuk menentukan apakah itu casebenar. Meskipun ini adalah perilaku khas untuk implementasi isCase(Object), kami dapat menentukannya apakah itu masalahnya atau tidak dengan cara yang kami inginkan.

Daftar 3. State.java

package dustin.examples; import static java.lang.System.out; public class State { private String stateName; public State(final String newStateName) { this.stateName = newStateName; } /** * Method to be used by Groovy's switch implicitly when an instance of this * class is switched on. * * @param compareState State passed via case to me to be compared to me. */ public boolean isCase(final State compareState) { return compareState != null ? compareState.equals(this) : false; } public boolean equals(final Object other) { if (!(other instanceof State)) { return false; } final State otherState = (State) other; if (this.stateName == null ? otherState.stateName != null : !this.stateName.equals(otherState.stateName)) { return false; } return true; } @Override public String toString() { return this.stateName; } } 

Kelas Java standar sederhana yang ditunjukkan di atas mengimplementasikan isCasemetode yang memungkinkan Groovy untuk mengaktifkannya. Skrip Groovy berikut menggunakan kelas ini dan berhasil mengaktifkan contoh State.

#!/usr/bin/env groovy import dustin.examples.State State state = new State("Arkansas") State alabama = new State("Alabama") State arkansas = new State("Arkansas") State alaska = new State("Alaska") State arizona = new State("Arizona") State california = new State("California") State colorado = new State("Colorado") State connecticut = new State("Connecticut") print "The motto for the state of ${state.stateName} is '" switch (state) { case alabama : print "Audemus jura nostra defendere" break case alaska : print "North to the future" break case arizona : print "Ditat Deus" break case arkansas : print "Regnat populus" break case california : print "Eureka" break case colorado : print "Nil sine numine" break case connecticut : print "Qui transtulit sustinet" break default : print "<>" } println "'" 

Output di snapshot layar berikutnya menunjukkan bahwa skrip Groovy berhasil mengaktifkan instance Stateobjek. Perintah pertama adalah menggunakan "sederhana" contoh yang dibahas sebelumnya dan perintah kedua adalah menggunakan contoh bahwa kebutuhan untuk memanggil State's isCase(State)metode.

Keindahan dari kemampuan ini untuk membuat kelas menjadi "dapat dialihkan" berdasarkan penerapan isCase()metode adalah memungkinkan sintaks yang lebih ringkas dalam situasi yang sebaliknya mungkin memerlukan konstruksi / if/ yang panjang . Sebaiknya hindari konstruksi seperti itu sepenuhnya, tetapi terkadang kita menjumpainya dan pernyataan Groovy membuatnya tidak terlalu membosankan.else ifelseswitch

Sangat mungkin dengan Groovy switchuntuk memiliki beberapa opsi sakelar yang sesuai dengan kondisi yang ditentukan. Oleh karena itu, penting untuk membuat daftar casepernyataan dalam urutan pencocokan mana yang disukai karena yang pertama akan dieksekusi. Kata breakkunci digunakan di Groovy switchseperti di Java.

Ada lebih banyak kekuatan dalam apa yang switchdidukung Groovy . Beberapa posting yang mencakup kekuatan ini termasuk Groovy Goodness: The Switch Statement, Groovy, izinkan saya menghitung cara saya mencintaimu, dan dokumentasi Groovy.

Cerita ini, "Groovy: Aktifkan Steroid", awalnya diterbitkan oleh JavaWorld.