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