Sažetak nastave na Javi

1. Pregled

Mnogo je slučajeva kada provedba ugovora želimo odgoditi da bi neki dijelovi provedbe bili dovršeni kasnije. To možemo lako postići na Javi putem apstraktnih klasa.

U ovom uputstvu naučit ćemo osnove apstraktnih predavanja u Javi i u kojim slučajevima mogu biti korisne.

2. Ključni koncepti apstraktne nastave

Prije ulaska u to kada koristiti apstraktni tečaj, pogledajmo njihove najrelevantnije karakteristike:

  • Apstraktnu klasu definiramo s sažetak modifikator koji prethodi razred ključna riječ
  • Apstraktna klasa može se podklasirati, ali ne može se napraviti instanca
  • Ako klasa definira jednu ili više njih sažetak metode, tada se mora deklarirati sama klasa sažetak
  • Apstraktna klasa može deklarirati i apstraktne i konkretne metode
  • Potklasa izvedena iz apstraktne klase mora ili implementirati sve apstraktne metode osnovne klase ili sama biti apstraktna

Da bismo bolje razumjeli ove koncepte, stvorit ćemo jednostavan primjer.

Neka naša osnovna apstraktna klasa definira apstraktni API društvene igre:

javni sažetak klase BoardGame {// ... terenske deklaracije, konstruktori public abstract void play (); // ... konkretne metode}

Zatim možemo stvoriti podrazred koji implementira igra metoda:

public class Checkers proširuje BoardGame {public void play () {// ... implementacija}}

3. Kada koristiti sažetak nastave

Sada, analizirajmo nekoliko tipičnih scenarija u kojima bismo više voljeli apstraktne klase u odnosu na sučelja i konkretni razredi:

  • Želimo enkapsulirati neke uobičajene funkcije na jednom mjestu (ponovna upotreba koda) koje će dijeliti više povezanih potklasa
  • Moramo djelomično definirati API koji naše podrazrede mogu lako proširiti i usavršiti
  • Potklase trebaju naslijediti jednu ili više uobičajenih metoda ili polja s modifikatorima zaštićenog pristupa

Imajmo na umu da su svi ovi scenariji dobri primjeri potpunog poštivanja principa otvoreno / zatvoreno na temelju nasljeđa.

Štoviše, budući da se upotreba apstraktnih klasa implicitno bavi osnovnim tipovima i podtipovima, također koristimo polimorfizam.

Imajte na umu da je ponovna upotreba koda vrlo uvjerljiv razlog za upotrebu apstraktnih klasa, sve dok je očuvana veza "is-a" unutar hijerarhije klasa.

A Java 8 dodaje još jednu boru sa zadanim metodama, koje ponekad mogu zamijeniti potrebu za stvaranjem apstraktne klase.

4. Uzorak hijerarhije čitača datoteka

Da bismo jasnije razumjeli funkcionalnost koju apstraktne klase donose na stol, pogledajmo još jedan primjer.

4.1. Definiranje osnovne apstraktne klase

Dakle, ako bismo željeli imati nekoliko vrsta čitača datoteka, mogli bismo stvoriti apstraktnu klasu koja obuhvaća ono što je zajedničko čitanju datoteka:

javna apstraktna klasa BaseFileReader {zaštićeni put filePath; zaštićeni BaseFileReader (Path filePath) {this.filePath = filePath; } javni put getFilePath () {return filePath; } javni popis readFile () baca IOException {return Files.lines (filePath) .map (this :: mapFileLine) .collect (Collectors.toList ()); } zaštićeni sažetak String mapFileLine (linija niza); }

Imajte na umu da smo napravili filePath zaštićen tako da mu potklase mogu pristupiti ako je potrebno. Što je još važnije, ostavili smo nešto poništeno: kako zapravo raščlaniti redak teksta iz sadržaja datoteke.

Naš je plan jednostavan: premda svaka naša konkretna klasa nema poseban način za pohranu puta datoteke ili za hod kroz datoteku, svaka će imati poseban način za transformiranje svake linije.

Na prvi pogled, BaseFileReader može činiti nepotrebnim. Međutim, to je temelj čistog dizajna koji se lako može proširiti. Iz toga, možemo lako implementirati različite verzije čitača datoteka koje se mogu usredotočiti na njihovu jedinstvenu poslovnu logiku.

4.2. Definiranje potklasa

Prirodna implementacija je vjerojatno ona koja sadržaj datoteke pretvara u mala slova:

javna klasa LowercaseFileReader proširuje BaseFileReader {public LowercaseFileReader (Path filePath) {super (filePath); } @Override javni String mapFileLine (linija niza) {return line.toLowerCase (); }}

Ili drugi može biti onaj koji sadržaj datoteke pretvara u velika slova:

javna klasa UppercaseFileReader proširuje BaseFileReader {public UppercaseFileReader (Path filePath) {super (filePath); } @Override public String mapFileLine (String line) {return line.toUpperCase (); }}

Kao što vidimo iz ovog jednostavnog primjera, svaka se podrazred može usredotočiti na svoje jedinstveno ponašanje bez potrebe za određivanjem drugih aspekata čitanja datoteka.

4.3. Korištenje podrazreda

Konačno, upotreba klase koja nasljeđuje apstraktnu ne razlikuje se od bilo koje druge konkretne klase:

@Test public void givenLowercaseFileReaderInstance_whenCalledreadFile_thenCorrect () baca izuzetak {URL location = getClass (). GetClassLoader (). GetResource ("files / test.txt") Put path = Paths.get (location.toURI ()); BaseFileReader lowercaseFileReader = novi LowercaseFileReader (put); assertThat (lowercaseFileReader.readFile ()). isInstanceOf (List.class); }

Radi jednostavnosti, ciljna datoteka se nalazi ispod src / main / resources / files mapu. Stoga smo koristili alat za učitavanje klase aplikacija za dobivanje putanje datoteke primjera. Slobodno pogledajte naš vodič o učitavačima klasa na Javi.

5. Zaključak

U ovom kratkom članku, naučili smo osnove apstraktne nastave u Javi i kada ih koristiti za postizanje apstrakcije i enkapsulaciju zajedničke implementacije na jednom mjestu.

Kao i obično, svi uzorci koda prikazani u ovom vodiču dostupni su na GitHubu.