1. Введение
В этом кратком руководстве мы рассмотрим различные способы поиска типа данных в Groovy.
На самом деле, это зависит от того, что мы делаем:
- Во-первых, мы рассмотрим, что делать с примитивами.
- Затем мы увидим, как коллекции приносят уникальные проблемы.
- И, наконец, мы рассмотрим объекты и переменные класса.
2. Примитивные типы
Groovy поддерживает то же количество примитивных типов, что и Java. Мы можем найти тип данных примитивов тремя способами .
Для начала давайте представим, что у нас есть несколько представлений возраста человека.
Прежде всего, начнем с оператора instanceof :
@Test
public void givenWhenParameterTypeIsInteger_thenReturnTrue() {
Person personObj = new Person(10)
Assert.assertTrue(personObj.ageAsInt instanceof Integer);
}
instanceof
— это бинарный оператор, который мы можем использовать, чтобы проверить, является ли объект экземпляром данного типа. Он возвращает true
, если объект является экземпляром этого конкретного типа, и false
в противном случае.
Кроме того, в Groovy 3 добавлен новый оператор !instanceof
. Он возвращает true
, если объект не является экземпляром типа, и false
в противном случае.
Затем мы также можем использовать метод getClass()
из класса Object. Он возвращает класс времени выполнения экземпляра:
@Test
public void givenWhenParameterTypeIsDouble_thenReturnTrue() {
Person personObj = new Person(10.0)
Assert.assertTrue((personObj.ageAsDouble).getClass() == Double)
}
Наконец, давайте применим . оператор класса
, чтобы найти тип данных:
@Test
public void givenWhenParameterTypeIsString_thenReturnTrue() {
Person personObj = new Person("10 years")
Assert.assertTrue(personObj.ageAsString.class == String)
}
Точно так же мы можем найти тип данных любого примитивного типа.
3. Коллекции
Groovy обеспечивает поддержку различных типов коллекций.
Давайте определим простой список в Groovy:
@Test
public void givenGroovyList_WhenFindClassName_thenReturnTrue() {
def ageList = ['ageAsString','ageAsDouble', 10]
Assert.assertTrue(ageList.class == ArrayList)
Assert.assertTrue(ageList.getClass() == ArrayList)
}
Но на картах оператор .class
применить нельзя:
@Test
public void givenGrooyMap_WhenFindClassName_thenReturnTrue() {
def ageMap = [ageAsString: '10 years', ageAsDouble: 10.0]
Assert.assertFalse(ageMap.class == LinkedHashMap)
}
В приведенном выше фрагменте кода ageMap.class
попытается получить значение ключевого класса из данной карты . Для карт рекомендуется применять getClass()
, а не .class
.
4. Объекты и переменные класса
В приведенных выше разделах мы использовали различные стратегии для поиска типа данных примитивов и коллекций.
Чтобы увидеть, как работают переменные класса, предположим, что у нас есть класс Person
:
@Test
public void givenClassName_WhenParameterIsInteger_thenReturnTrue() {
Assert.assertTrue(Person.class.getDeclaredField('ageAsInt').type == int.class)
}
Помните, что getDeclaredField()
возвращает все поля определенного класса.
Мы можем найти тип любого объекта, используя операторы instanceof, getClass()
и .class
:
@Test
public void givenWhenObjectIsInstanceOfType_thenReturnTrue() {
Person personObj = new Person()
Assert.assertTrue(personObj instanceof Person)
}
Кроме того, мы также можем использовать оператор членства Groovy в
:
@Test
public void givenWhenInstanceIsOfSubtype_thenReturnTrue() {
Student studentObj = new Student()
Assert.assertTrue(studentObj in Person)
}
5. Вывод
В этой короткой статье мы увидели, как найти тип данных в Groovy. Для сравнения, метод getClass()
безопаснее, чем оператор .class .
Мы также обсудили работу оператора in
вместе с оператором instanceof
. Кроме того, мы научились получать все поля класса и применять оператор .type .
Как всегда, все фрагменты кода можно найти на GitHub .