Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Java 8
Code

Java 8 pro Android vývoj: výchozí a statické metody

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Java 8 for Android Development.
Java 8 for Android: Cleaner Code With Lambda Expressions
Java 8 for Android Development: Stream API and Date & Time Libraries

Czech (Čeština) translation by Tereza Foretová (you can also view the original English article)

Java 8 byl obrovský krok vpřed pro programovací jazyk a nyní, s vydáním Android Studio 3.0, vývojáři pro Android konečně mají přístup k integrovanou podporu pro některé z nejdůležitějších funkcí Java 8.

V tomto tří část série jsme zkoumání Java 8 funkcí, které můžete začít používat ve svých projektech Android dnes. V čistší kód s Lambda výrazy vytvořili jsme náš rozvoj použití Java 8 Podpora poskytovaná Android je výchozí toolchain, před přijetím Gripová lambda výrazy.

V tomto příspěvku se podíváme na dva různé způsoby-abstraktní metody lze deklarovat v rozhraní (něco, co nebylo možné v předchozích verzích jazyka Java). Budeme také odpovědět na otázku, teď, že rozhraní můžete implementovat metody, co přesně je rozdíl mezi rozhraní a abstraktní třídy?

Také budeme pokrývat Java 8 funkci, která vám dává svobodu používat stejné poznámky jako tolikrát, kolikrát chcete na stejném místě, zatímco zbývající zpětně kompatibilní se staršími verzemi operačního systému Android.

Nejdříve, ale pojďme podívat na funkce Java 8, který je určen k použití v kombinaci s lambda výrazy, které jsme viděli v předchozím příspěvku.

Psát čistší Lambda výrazy, s odkazy na metody

V poslední příspěvek viděl jste, jak použít lambda výrazy k odstranění spousty boilerplate kód z vašeho Android aplikací. Však Pokud lambda výraz je jednoduše volání jedné metody, která už má název, můžete snížit ještě více kódu z projektu s použitím referenční metody.

Například tento výraz lambda je opravdu jen přesměrování práci na existující metodu handleViewClick:

V tomto případě můžeme odkazují na tuto metodu podle názvu, použití:: metoda odkazovací operátor. Můžete vytvořit tento druh referenční metodu, pomocí následující formát:

V našem příkladu plovoucí tlačítko akce můžeme použít referenční metodu jako tělo našeho výrazu lambda:

Všimněte si, že odkazovaná metoda musí mít stejné parametry jako rozhraní – v tomto případě, to je pohled.

Referenční metoda operátor (:) slouží k odkaz na některou z následujících akcí:

Statické metody

Pokud máte výraz lambda, který volá statickou metodu:

Pak můžete proměnit jej referenční metody:

Například pokud jste měl statickou metodu PrintMessage ve třídě MyClass, pak referenční metodu by vypadat přibližně takto:

Metoda Instance určitého objektu

To je metoda instance objektu, který je znám dopředu, což umožňuje nahradit:

S:

Takže, pokud jste měli následující výraz lambda:

Pak zavedení referenční metodu by vám následující:

Metoda Instance libovolný objekt určitého typu

Jedná se o metodu instance libovolného objektu, který bude později dodány a zapsána v následujícím formátu:

Konstruktor odkazy

Konstruktor odkazy jsou podobné odkazy na metodu, s tím rozdílem, že použijete klíčové slovo new k vyvolání konstruktoru. Například Button::new je odkaz konstruktor pro třídu Button, přestože přesná konstruktor, který je vyvolán závisí na kontextu.

Použití konstruktoru odkazů, můžete zapnout:

Do:

Například, pokud jste měli následující rozhraní MyInterface:

Pak můžete použít odkazy konstruktor k vytvoření nové instance Student:

Je také možné vytvořit konstruktor odkazy pro typy polí. Například konstruktor referenční pro matici čísel je int []:: nové.

Přidat výchozí metody rozhraní

Před Java 8 mohou obsahovat pouze abstraktní metody v rozhraní (tj. metody bez těla), které bylo obtížné vyvinout rozhraní, po publikaci.

Pokaždé, když jste přidali metodu definice rozhraní, všechny třídy, které implementovat toto rozhraní by náhle chybí implementace. Například pokud jste měli rozhraní (MyInterface), který byl používán Moje_třída, pak přidání metody do MyInterface zrušit kompatibilitu s Moje_třída.

V nejlepším případě scénář, kde jste zodpovědný za malý počet tříd, které používají MyInterface, toto chování by být obtěžující, ale zvládnutelný – měli byste prostě zrušil nějaký čas k aktualizaci své třídy s novou implementací. Nicméně věci by se mohl stát mnohem složitější, velký počet tříd implementováno MyInterface nebo rozhraní byl použit v třídách, které nejsi zodpovědný za.

Sice počet řešení tohoto problému, žádný z nich nebyl ideální. Například můžete zahrnout nové metody v abstraktní třídy, ale to by stále vyžadují všichni k aktualizaci jejich kód pro rozšíření této abstraktní třídy; a zatímco můžete rozšířit původní rozhraní s novým rozhraním, každý, kdo chtěl použít tyto nové metody pak muset přepsat všechny existující odkazy rozhraní.

Se zavedením výchozích metod v Javě 8 je nyní možné deklarovat-abstraktní metody (např. metody s tělem) uvnitř rozhraní, takže si můžete konečně vytvořit výchozí implementace pro vaše metody.

Když Přidat metodu do rozhraní jako výchozí metodu, třídu, která implementuje toto rozhraní nemusí nutně poskytnout vlastní implementace, která poskytuje způsob aktualizace rozhraní bez porušení kompatibilitu. Pokud přidáte novou metodu na rozhraní jako výchozí metodu, pak každé třídy, která používá toto rozhraní, ale neposkytuje svou vlastní implementaci jednoduše zdědí výchozí implementaci metody. Vzhledem k tomu, třída není chybějící implementace, bude i nadále fungovat jako normální.

Ve skutečnosti zavedení výchozích metod byl důvod, že Oracle byl schopen udělat tak velký počet přírůstky do sbírky API v jazyce Java 8.

Kolekce je obecné rozhraní, který se používá v mnoha různých tříd, takže přidání nové metody tohoto rozhraní má potenciál rozbít bezpočet řádky kódu. Namísto přidání nových metod rozhraní kolekce a prolomení každé třídy, která byla odvozena z tohoto rozhraní, Oracle vytvořil funkci výchozí metodu a poté přidány tyto nové metody jako výchozí metody. Pokud jste podívat na novou metodu Collection.Stream(), (což budeme zkoumat podrobně v třetí části), uvidíte, že byl přidán jako výchozí metoda:

Vytvoření výchozí metoda je jednoduchá – stačí přidat modifikátor výchozí podpis metody:

Nyní Pokud Moje_třída používá MyInterface ale neposkytuje svou vlastní implementaci defaultMethod, jen zdedí výchozí implementace poskytovaná MyInterface. Například bude stále kompilovat následující třídy:

Prováděcí třídy lze přepsat výchozí implementace poskytovaná rozhraní, takže třídy jsou stále v úplnou kontrolu nad jejich implementace.

Výchozí metody jsou vítaným doplňkem pro návrháře rozhraní API, mohou občas způsobit problém pro vývojáře, kteří se snaží použít více rozhraní ve stejné třídě.

Představte si, že kromě MyInterface, máte následující:

MyInterface a SecondInterface obsahují výchozí metodu stejným podpisem (defaultMethod). Teď si představte, pokusíte použít obě tato rozhraní ve stejné třídě:

V tomto okamžiku máte dvě protichůdné implementace defaultMethod a kompilátor nemá tušení, jakou metodu by měl použít, takže dojde k chybě kompilátoru.

Jedním ze způsobů řešení tohoto problému je přepsat metodu konfliktní s implementací:

Jiné řešení je určit, která verze defaultMethod chcete implementovat, v následujícím formátu:

Takže pokud jste chtěli volat implementace MyInterface#defaultMethod(), použijete následující:

Použití statických metod v rozhraní Java 8

Podobně jako výchozí metody, metody statické rozhraní umožňují definování metody uvnitř rozhraní. Nicméně na rozdíl od výchozí metody, implementující třídu nemůže přepsat statické metody rozhraní.

Je-li statické metody, které jsou specifické pro rozhraní a metody statické rozhraní Java 8 vám způsob umístění tyto metody uvnitř odpovídající rozhraní, spíše než museli uložit v samostatné třídě.

Vytvořte statickou metodu umístěním klíčového slova static na začátku podpis metody, například:

Pokud implementujete rozhraní, které obsahuje metodu statické rozhraní, že statická metoda je stále součástí rozhraní a není zděděna třídou ji provádějí, takže budete muset předpona metodu s jméno rozhraní, například:

To také znamená, že třídy a rozhraní může mít statickou metodu se stejným podpisem. Například pomocí MyClass.staticMethod a MyInterface.staticMethod ve stejné třídě nezpůsobí chybu v době kompilace.

Ano jsou v podstatě jen abstraktní třídy rozhraní?

Přidání metody statické rozhraní a výchozích metod vedla některé vývojáři na otázku, zda rozhraní Javy jsou stále více jako abstraktní třídy. Nicméně dokonce i s přidáním výchozí a metody statické rozhraní, stále existují některé významné rozdíly mezi rozhraní a abstraktní třídy:

  • Abstraktní třídy mohou mít konečné, není konečný, statické a statické proměnné, zatímco rozhraní může mít pouze statické a poslední proměnné.
  • Abstraktní třídy umožňují deklarovat pole, které nejsou statické a konečné, zatímco na rozhraní pole jsou ze své podstaty statická a konečná.
  • V rozhraní všechny metody, které deklarovat nebo definovat jako výchozí metody jsou ve své podstatě veřejné, zatímco v abstraktních tříd můžete definovat veřejné, chráněné a soukromé konkrétní metody.
  • Abstraktní třídy jsou třídy a proto může mít stát; rozhraní nemůže mít stavy spojené s nimi.
  • Můžete definovat konstruktory uvnitř abstraktní třídy, něco, co není možné uvnitř rozhraní Javy.
  • Java umožňuje pouze jednu třídu (bez ohledu na to, zda je abstraktní) rozšířit, ale máte možnost implementovat rozhraní tolik, kolik potřebujete. To znamená, že rozhraní obvykle mají okraje když požadujete vícenásobné dědičnosti, přestože je třeba pozor na smrtící diamant smrti!

Platí stejné poznámky jako tolikrát, kolikrát chcete

Jedním z omezení Java anotace je tradičně nelze použít stejné poznámky více než jednou na stejném místě. Zkuste použít stejné poznámky vícekrát, a budeš dojde k chybě kompilace.

Však se zavedením Java 8 opakující poznámky, jste nyní volně používat stejné poznámky jako tolikrát, kolikrát chcete, na stejném místě.

Chcete-li zajistit, že váš kód zůstane kompatibilní s předchozími verzemi Java, budete muset ukládat opakující poznámky v kontejneru poznámky.

Můžete zjistit, že kompilátor generovat tento kontejner, provedením následujících kroků:

  • Označte poznámku s @Repeatable meta poznámky (poznámky, který se používá k anotaci poznámky). Například pokud jste chtěli udělat poznámky @ToDo opakovatelné, byste použít: @Repeatable(ToDos.class). Hodnota v závorce je typ kontejneru poznámky, které nakonec vygeneruje kompilátor.
  • Deklarujte typ obsahující poznámky. To musí mít atribut, který je pole s opakováním anotaci typu, například:

Došlo k pokusu o použití stejné poznámky vícekrát, aniž by nejprve prohlásil, že je to opakovatelné bude mít za následek chybu v čase kompilace. Nicméně jakmile jste určili, že se jedná o opakované poznámky, můžete použít tuto poznámku vícekrát v jakémkoli místě, kde byste použili standardní poznámky.

Závěr

V této druhé části našeho seriálu o Java 8 jsme viděli, jak můžete snížit ještě více boilerplate kód z vašeho Android projekty kombinací výrazů lambda s odkazy na metody a jak vylepšit vaše rozhraní s výchozí a statické metody.

V třetí a poslední díl podíváme se na nové Java 8 API, které umožňuje proces obrovské množství dat efektivnější, deklarativní způsobem, aniž by se museli starat o řízení souběžnosti a podproces. Jsme vám také být vázání dohromady několik různých funkcí, které jsme diskutovali v celé této série, tím, že zkoumá roli, kterou funkční rozhraní hrát v lambda výrazy, metody statické rozhraní a výchozích metod.

A konečně, i když stále ještě čekáme na Java 8 nové datum a čas API oficiálně dorazí na Android, ukážu, jak můžete začít používat toto nové rozhraní API v Android projektech dnes, s pomocí některých knihoven třetích stran.

Mezitím Podívejte se na některé z našich dalších příspěvků na vývoj aplikací pro Android a Java!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.