Перейти к основному содержимому

Как определить тип данных в Groovy

· 3 мин. чтения

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 .