Általános kivitelezők a Java-ban

1. Áttekintés

Korábban megvitattuk a Java Generics alapjait. Ebben az oktatóanyagban áttekintjük a Java általános generátorait.

Az általános konstruktor olyan konstruktor, amelynek legalább egy általános típusú paramétere van.

Meglátjuk, hogy a generikus konstruktoroknak nem kell általános osztályba tartozniuk, és nem egy generikus osztály összes konstruktorának kell generikusnak lennie.

2. Nem általános osztály

Először is van egy egyszerű osztályunk Belépés, amely nem általános osztály:

public class Entry {private String adatok; magán int rang; }

Ebben az osztályban két konstruktort adunk hozzá: egy két paraméteres alapkonstruktort és egy általános konstruktort.

2.1. Alapvető kivitelező

Az első Belépés konstruktor egy egyszerű konstruktor két paraméterrel:

public Entry (String adatok, int rang) {this.adatok = adatok; ez.rang = rang; }

Most használjuk ezt az alapvető konstruktort egy Belépés tárgy:

@Test public void givenNonGenericConstructor_whenCreateNonGenericEntry_thenOK () {Entry entry = new Entry ("minta", 1); assertEquals ("minta", entry.getData ()); assertEquals (1, entry.getRank ()); }

2.2. Általános kivitelező

Ezután a második konstruktorunk egy általános konstruktor:

public Entry (E elem) {this.data = elem.toString (); this.rank = element.getRank (); }

Habár a Belépés osztály nem általános, hanem generikus konstruktorral rendelkezik, mivel van paramétere elem típusú E.

Az általános típus E korlátos, és mindkettőt végre kell hajtania Rangsorolható és Sorosítható interfészek.

Most vessünk egy pillantást a Rangsorolható interfész, amelynek egyetlen módszere van:

nyilvános felület Rankable {public int getRank (); }

Tegyük fel, hogy van osztályunk Termék hogy megvalósítja a Rangsorolható felület:

public class Termék megvalósítások Rankable, Serializable {private String name; magán dupla ár; magán int értékesítés; public Termék (karakterlánc neve, dupla ár) {this.name = név; ez.ár = ár; } @Orride public int getRank () {return sales; }}

Ezután felhasználhatjuk az általános konstruktort a létrehozáshoz Belépés objektumok a Termék:

@Test public void givenGenericConstructor_whenCreateNonGenericEntry_thenOK () {Product product = new Product ("milk", 2.5); product.setSales (30); Bejegyzés bejegyzés = új bejegyzés (termék); assertEquals (product.toString (), entry.getData ()); assertEquals (30, entry.getRank ()); }

3. Általános osztály

Ezután megnézzük az úgynevezett általános osztályt GenericEntry:

public class GenericEntry {private T data; magán int rang; }

Ugyanazt a két típusú kivitelt adjuk hozzá, mint ebben az osztályban az előző szakasz is.

3.1. Alapvető kivitelező

Először írjunk egy egyszerű, nem generikus konstruktort a sajátunk számára GenericEntry osztály:

public GenericEntry (int rank) {this.rank = rang; }

Annak ellenére GenericEntry egy általános osztály, ez egy egyszerű konstruktor, amely nem rendelkezik általános típusú paraméterrel.

Most ezt a konstruktort használhatjuk a GenericEntry:

@Test public void givenNonGenericConstructor_whenCreateGenericEntry_thenOK () {GenericEntry bejegyzés = új GenericEntry (1); assertNull (entry.getData ()); assertEquals (1, entry.getRank ()); }

3.2. Általános kivitelező

Ezután adjuk hozzá a második konstruktort az osztályunkhoz:

public GenericEntry (T adatok, int rang) {ez.adatok = adatok; ez.rang = rang; }

Ez egy általános konstruktor, mivel rendelkezik egy adat az általános típusú paraméter T. Ne feledje, hogy nem kell hozzáfűznünk a konstruktor deklarációjában, mivel az implicit módon ott van.

Most teszteljük általános konstruktorunkat:

@Test public void givenGenericConstructor_whenCreateGenericEntry_thenOK () {GenericEntry bejegyzés = új GenericEntry ("minta", 1); assertEquals ("minta", entry.getData ()); assertEquals (1, entry.getRank ()); }

4. Különböző típusú általános kivitelező

Általános osztályunkban van egy konstruktorunk is, amelynek általános típusa különbözik az osztály általános típusától:

public GenericEntry (E elem) {this.data = (T) elem; this.rank = element.getRank (); }

Ez GenericEntry a konstruktornak van paramétere elem típussal E, amely különbözik a T típus. Lássuk működés közben:

@Test public void givenGenericConstructorWithDifferType_whenCreateGenericEntry_thenOK () {Product product = new Product ("milk", 2.5); product.setSales (30); GenericEntry bejegyzés = új GenericEntry (termék); assertEquals (termék, bejegyzés.getData ()); assertEquals (30, entry.getRank ()); }

Vegye figyelembe, hogy:

  • Példánkban használtuk Termék (E) létrehozásához GenericEntry típusú Sorosítható (T)
  • Ezt a konstruktort csak akkor használhatjuk, ha a típusú paraméter E rádobható T

5. Több általános típus

Ezután megkapjuk az általános osztályt MapEntry két általános típussal:

nyilvános osztály MapEntry {privát K kulcs; magán V érték; public MapEntry (K kulcs, V érték) {this.key = kulcs; ez.érték = érték; }}

MapEntry van egy generikus konstruktora két paraméterrel, mindegyik más és más. Használjuk egyszerű egységtesztben:

@Test public void givenGenericConstructor_whenCreateGenericEntryWithTwoTypes_thenOK () {MapEntry bejegyzés = új MapEntry ("minta", 1); assertEquals ("minta", entry.getKey ()); assertEquals (1, entry.getValue (). intValue ()); }

6. Helyettesítő karakterek

Végül használhatunk helyettesítő karaktereket egy általános konstruktorban:

public GenericEntry (Opcionális választható) {if (opcionális.isPresent ()) {this.adatok = (T) választható.get (); this.rank = opcionális.get (). getRank (); }}

Itt helyettesítő karaktereket használtunk ebben GenericEntry kivitelező a megkötésére Választható típus:

@Test public void givenGenericConstructorWithWildCard_whenCreateGenericEntry_thenOK () {Product product = new Product ("milk", 2.5); product.setSales (30); Opcionális választható = Opcionális. (Termék); GenericEntry bejegyzés = új GenericEntry (opcionális); assertEquals (termék, bejegyzés.getData ()); assertEquals (30, entry.getRank ()); }

Ne feledje, hogy képesnek kell lennünk az opcionális paramétertípus leadására (esetünkben Termék) hoz GenericEntry típus (esetünkben Sorosítható).

7. Következtetés

Ebben a cikkben megtanultuk, hogyan kell definiálni és használni az általános konstruktorokat mind az általános, mind a nem általános osztályokban.

A teljes forráskód megtalálható a GitHub oldalon.