Those Brackets Really Matter in a Groovy Switch!
I’ve been working on a data detector plugin for Grails as a side project, and thought it important to mention the importance of including brackets {} for logic statements in groovy switches.
Below I have a simple detector for a simple DataType enum that has STRING and DECIMAL (which in my real code is BigDecimal) types.
public enum DataType { STRING, DECIMAL }
Is you leave the {} from around NumberUtils.isNumber — everything comes back STRING! So make sure you include them even for a one-step logic decision:
public static DataType detectTypeFromString(String data) {
switch (data) {
case { NumberUtils.isNumber(data) }:
return DataType.DECIMAL
default:
return DataType.STRING
}
}
Of course it makes a lot more sense if you have a compound statement. Here, a number is defined from a string as 0 or any number that doesn’t start with 0 because it would be an identifier:
public static DataType detectTypeFromString(String data) {
switch (data) {
case { data?.equals('0') || (!data?.startsWith('0')
&& NumberUtils.isNumber(data)) }:
return DataType.DECIMAL
default:
return DataType.STRING
}
}
So I make sure I am careful about the syntax, especially groovy where tiny little syntax characters make a big difference!
code, Grails, groovy