Úvod do vlastností v Groovy

1. Prehľad

V tomto tutoriále preskúmame koncept vlastností v Groovy. Boli predstavené vo vydaní Groovy 2.3.

2. Čo sú vlastnosti?

Vlastnosti sú opakovane použiteľné komponenty predstavujúce množinu metód alebo správania, ktoré môžeme použiť na rozšírenie funkčnosti viacerých tried.

Pre tento dôvod, považujú sa za rozhrania nesúce predvolené implementácie aj stav. Všetky vlastnosti sú definované pomocou vlastnosť kľúčové slovo.

3. Metódy

Vyhlásenie metódy v a vlastnosť je podobné deklarovaniu akejkoľvek bežnej metódy v triede. Nemôžeme však deklarovať chránené alebo balíkovo súkromné ​​metódy v a vlastnosť.

Pozrime sa, ako sa implementujú verejné a súkromné ​​metódy.

3.1. Verejné metódy

Na začiatok preskúmame, ako na to verejné metódy sú implementované v a vlastnosť.

Vytvorme a vlastnosť menovaný UserTrait a a verejnépovedz ahoj metóda:

vlastnosť UserTrait {Reťazec sayHello () {návrat „Ahoj!“ }}

Potom vytvoríme Zamestnanec triedy, ktorá realizuje UserTrait:

trieda Zamestnanec implementuje UserTrait {}

Teraz vytvorme test na overenie, či Zamestnanec inštancia má prístup povedz ahoj metóda UserTrait:

def 'Mal by vrátiť reťazec msg pri použití metódy Employee.sayHello poskytnutej vlastnosťou používateľa' () {keď: def msg = employee.sayHello () potom: msg msg instanceof String assert msg == "Ahoj!" }

3.2. Súkromné ​​metódy

Môžeme tiež vytvoriť a súkromné metóda v a vlastnosť a odkazovať na to v inom verejné metóda.

Pozrime sa na implementáciu kódu v UserTrait:

private String greetingMessage () {return 'Hello, from a private method!' } String greet () {def msg = welcomeMessage () println msg return msg} 

Upozorňujeme, že ak vstúpime do súkromné metóda v implementačnej triede, bude hádzať a MissingMethodException:

def 'Mal by sa vrátiť MissingMethodException pri použití metódy Employee.greetingMessage' () {keď: def výnimka skúste {employee.greetingMessage ()} catch (Výnimka e) {výnimka = e} potom: výnimka výnimka instanceof groovy.lang.MissingMethodException uplatniť výnimku. message == "Žiadny podpis metódy: com.baeldung.traits.Employee.greetingMessage ()" + "je použiteľný pre typy argumentov: () hodnoty: []"}

V vlastnosť, súkromná metóda môže byť nevyhnutná pre každú implementáciu, ktorá by nemala byť prepísaná žiadnou triedou, aj keď to vyžaduje iná verejná metóda.

3.3. Abstraktné metódy

A vlastnosť môže obsahovať aj abstraktné metódy, ktoré potom môžu byť implementované v inej triede:

vlastnosť UserTrait {abstrakt Názov reťazca () reťazec showName () {návrat "Dobrý deň, $ {name ()}!" }}
trieda Zamestnanec implementuje UserTrait {názov reťazca () {návrat 'Bob'}} 

3.4. Prekonanie predvolených metód

Spravidla a vlastnosť obsahuje predvolené implementácie svojich verejných metód, ale môžeme ich prepísať v triede implementácie:

vlastnosť SpeakingTrait {String speak () {návrat "Hovorím !!" }} 
trieda Pes implementuje SpeakingTrait {String speak () {návrat "Bow Bow !!" }} 

Rysy nepodporujú chránené a súkromné rozsahy.

4. toto Kľúčové slovo

Správanie toto kľúčové slovo je podobné ako v Jave. Môžeme zvážiť vlastnosť ako Super trieda.

Napríklad vytvoríme metódu, ktorá sa vráti toto v vlastnosť:

vlastnosť UserTrait {def self () {return this}}

5. Rozhrania

A vlastnosť môže tiež implementovať rozhrania, rovnako ako bežné triedy.

Vytvorme rozhranie a implementovať ho do a vlastnosť:

rozhranie Human {String lastName ()}
vlastnosť UserTrait implementuje Human {String showLastName () {return "Hello, $ {lastName ()}!" }}

Teraz poďme implementovať abstraktné metóda rozhranie v triede implementácie:

trieda Zamestnanec implementuje UserTrait {String lastName () {return "Marley"}}

6. Vlastnosti

Môžeme pridať vlastnosti do a vlastnosť rovnako ako v každej bežnej triede:

vlastnosť UserTrait implementuje človeka {String email String address}

7. Rozširovanie vlastností

Podobne ako bežný Groovy trieda, a vlastnosť môže predĺžiť ďalší vlastnosť pomocou predlžuje kľúčové slovo:

vlastnosť WheelTrait {int noOfWheels} vlastnosť VehicleTrait rozširuje WheelTrait {String showWheels () {návrat "Počet kolies $ noOfWheels"}} trieda Automobil implementuje VehicleTrait {}

Môžeme tiež rozšíriť viac znakov pomocou náradie doložka:

vlastnosť AddressTrait {String residencyAddress} vlastnosť EmailTrait {vlastnosť reťazca} vlastnosť Osoba implementuje AddressTrait, EmailTrait {}

8. Viacnásobné konflikty dedičstva

Keď trieda implementuje dva alebo viac znakov, ktoré majú metódy s rovnakým podpisom, musíme vedieť, ako konflikty vyriešiť. Pozrime sa na to, ako Groovy predvolene rieši takéto konflikty, a na spôsob, ktorým môžeme prepísať predvolené rozlíšenie.

8.1. Predvolené riešenie konfliktov

Predvolene metóda z posledného deklarovaného vlastnosť v náradie doložka bude vyzdvihnutá.

Preto nám vlastnosti pomáhajú implementovať viac dedičstiev bez toho, aby sme narazili na diamantový problém.

Najskôr vytvorme dva znaky metódou, ktorá má rovnaký podpis:

vlastnosť WalkingTrait {String basicAbility () {návrat „Walking !!“ }} vlastnosť SpeakingTrait {String basicAbility () {návrat "Hovorím !!" }} 

Ďalej napíšeme triedu, ktorá implementuje obe vlastnosti:

trieda Pes implementuje WalkingTrait, SpeakingTrait {} 

Pretože SpeakingTrait je vyhlásený za posledný, jeho basicAbility implementácia metódy by bola štandardne zachytená v pes trieda.

8.2. Výslovné riešenie konfliktov

Ak teraz nechceme jednoducho použiť predvolené riešenie konfliktov poskytované jazykom, môžeme ho prepísať odvýslovne zvoliť metódu, ktorá sa má zavolať, pomocou vlastnosť.super.metóda odkaz.

Napríklad pridajme k našim dvom znakom ďalšiu metódu s rovnakým podpisom:

String speakAndWalk () {návrat „Choď a hovor !!“ }
String speakAndWalk () {návrat "Hovor a choď !!" }

Teraz prepíšeme predvolené riešenie viacerých konfliktov dedičnosti v našom pes triedy pomocou Super kľúčové slovo:

trieda Pes implementuje WalkingTrait, SpeakingTrait {String speakAndWalk () {WalkingTrait.super.speakAndWalk ()}}

9. Implementácia vlastností za behu

Implementovať a vlastnosť dynamicky, môžeme Použi ako kľúčové slovo na donútenie objektu k a vlastnosť za behu.

Vytvorme si napríklad AnimalTrait s basicBehavior metóda:

vlastnosť AnimalTrait {String basicBehavior () {návrat "Animalistic !!" }}

Na implementáciu viacerých znakov naraz môžeme použiť withTraits metóda namiesto ako kľúčové slovo:

def dog = new Dog () def dogWithTrait = dog.withTraits SpeakingTrait, WalkingTrait, AnimalTrait

10. Záver

V tomto článku sme videli, ako vytvoriť vlastnosti v Groovy, a preskúmali sme niektoré z ich užitočných funkcií.

A vlastnosť je skutočne efektívny spôsob pridávania bežných implementácií a funkcií do všetkých našich tried. Okrem toho nám umožňuje minimalizovať nadbytočný kód a uľahčuje údržbu kódu.

Ako obvykle sú implementácie kódu a testy jednotiek pre tento článok k dispozícii na GitHub.