«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)
}

Наконец, давайте применим оператор .class, чтобы найти тип данных:

@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.

«