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

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.