Groovy: Включете стероиди

АКТУАЛИЗАЦИЯ: Тази публикация претърпя значителни актуализации на 17 ноември 2016 г., за да коригира погрешни твърдения и примери, да поправи основното HTML оформление (което не е очевидно за читателите, освен ако не преглеждате HTML източника в уеб браузър) и да коригира някои проблеми с правописа. Ако по някаква причина искате да видите старата, неправилна публикация, разгледайте версията, архивирана от Wayback Machine.

И преди съм писал в блога относно поддръжката на Groovy за включване на String. Groovy може да включи много повече от просто буквални Strings (и буквални интегрални типове, които Java позволява да се включат ) и аз демонстрирам това накратко тук.

switchИзявлението на Groovy ще използва метод, реализиран с името " isCase", за да определи дали дадена switchопция съответства. Това означава, че персонализираните обекти могат да се "превключват" в Groovy. За простия пример в тази публикация в блога ще използвам класовете Java SimpleStateи State.java.

Листинг 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; } } 

Представянето на горния клас на Java Stringможе да бъде включено в скрипт Groovy, както е показано в следващия списък с кодове за switchOnSimpleState.groovy:

Листинг 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 "'" 

Когато горният скрипт Groovy се изпълнява срещу горния прост Java клас, кодът отпечатва правилната информация, тъй като Groovy имплицитно извиква toString()метода на Stateвключен екземпляр "състояние" . Подобна функционалност вече може да бъде постигната и в Java, но трябва изрично да се извика toString()включеният обект. Също така си струва да се има предвид, че когато написах оригиналната версия на тази публикация в началото на 2010 г., Java не поддържаше включването на Strings. Резултатът от изпълнението на горното е показан в екранната снимка по-долу (името на скрипта не съвпада по-горе, защото това е стара снимка на екрана от тази оригинална публикация, преди да бъде коригирана и актуализирана).

С Groovy и isCaseметода мога да включа почти всеки тип данни, който харесвам. За да се демонстрира това, Stateще се използва Java класът и неговият списък с кодове е показан по-долу. Той включва isCase(State)метод, който Groovy имплицитно ще извика, когато екземплярите Stateса включени като caseизбор. В този случай isCase(State)методът просто извиква State.equals(Object)метода, за да определи дали това caseе вярно. Въпреки че това е типичното поведение за внедряванията на isCase(Object), бихме могли да го накараме да определи дали е така или не по какъвто и да е начин.

Листинг 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; } } 

Показаният по-горе прост стандартен Java клас реализира isCaseметод, който ще позволи на Groovy да го включи. Следният скрипт Groovy използва този клас и е в състояние успешно да включи екземпляра на 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 "'" 

Изходът в следващата екранна снимка показва, че скриптът Groovy е в състояние успешно да включи екземпляр на Stateобект. Първата команда е с помощта на "прост" примера, представен по-рано, а втората команда използва примера, който да се позове Stateе isCase(State)метод.

Красотата на тази способност класовете да могат да се „превключват“ въз основа на внедряването на isCase()метод е, че позволява по-кратък синтаксис в ситуации, които иначе биха изисквали дълги if/ else if/ elseконструкции. За предпочитане е да се избягват напълно такива конструкции, но понякога се натъкваме на тях и switchизявлението на Groovy ги прави по-малко досадни.

Напълно възможно е с Groovy switchда има множество опции за превключване, които да отговарят на посочените условия. Следователно е важно да изброите caseизвлеченията по реда на това кое съвпадение е предпочитано, тъй като първото съвпадение ще бъде изпълненото. В breakключова дума се използва в Groovy е switchкакто е в Java.

Има много повече сила в това, което Groovy switchподдържа. Някои публикации, които покриват тази сила, включват Groovy Goodness: The Switch Statement, Groovy, позволете ми да преброя начините, по които ви обичам, и документацията на Groovy.

Тази история „Groovy: Включване на стероиди“ първоначално е публикувана от JavaWorld.