Výchozí a statické metody rozhraní. Tomáš Pitner, upravil Marek Šabo

Podobné dokumenty
Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

typová konverze typová inference

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Výčtový typ strana 67

Generické programování

Abstraktní třída a rozhraní

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

Chování konstruktorů a destruktorů při dědění

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Seminář Java IV p.1/38

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo

Java - řazení objektů

3. Třídy. Základní pojmy objektového programování. Třídy

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Dědění, polymorfismus

Základy objektové orientace I. Únor 2010

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Návrhové vzory OMO, LS 2014/2015

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

1. Programování proti rozhraní

Výjimky. Tomáš Pitner, upravil Marek Šabo

20. Projekt Domácí mediotéka

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Quo vadis programování? Automatizace vyhodnocování studentských úloh

RMI Remote Method Invocation

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Iterator & for cyklus

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Projekty pro výuku programování v jazyce Java

9. Polymorfismus a rozhraní

RMI - Distribuované objekty v Javě

PREPROCESOR POKRAČOVÁNÍ

Návrh softwarových systém. Návrh softwarových systémů

10 Balíčky, grafické znázornění tříd, základy zapozdření

10 Generické implementace

1. Dědičnost a polymorfismus

Google Web Toolkit. Martin Šurkovský, SUR března Katedra informatiky

Java - výjimky. private void vstup() throws IOException {... }

24. listopadu 2013, Brno Připravil: David Procházka

Dědičnost. seskupování tříd do hierarchie. potomek získá všechny vlastnosti a metody. provádí se pomocí dvojtečky za názvem třídy.

Programování v C++ 1, 6. cvičení

Dědičnost (inheritance)

Lambda funkce Novinky v interfaces Streamy Optional - aneb zbavujeme se null. Java 8. Ondřej Hrstka

Programování v C++ VI

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2009 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 25

UJO Framework. revoluční architektura beans. verze

Neměnné objekty. Tomáš Pitner, upravil Marek Šabo

PB161 Programování v jazyce C++ Přednáška 10

boolean hasnext() Object next() void remove() Kolekce

Abstraktní datové typy: zásobník

Čipové karty Lekařská informatika

OSGi. Aplikační programování v Javě (BI-APJ) - 6 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

Programovací jazyk Java

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Úvod do programovacích jazyků (Java)

Úvod do programování v jazyce Java

Principy objektově orientovaného programování

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Remote Method Invocation RMI

11. Dědičnost. Dědičnost strana 103

Java a XML. 10/26/09 1/7 Java a XML

KTE / ZPE Informační technologie

IRAE 07/08 Přednáška č. 1

návrhový vzor Singleton.

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Algoritmizace a programování

Jini (pronounced GEE-nee) Cvičení 8 - DS 2006

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

NPRG031 Programování II 1 / :25:46

Jazyk C# (seminář 3)

NMIN201 Objektově orientované programování 1 / :36:09

Jazyk C++ I. Polymorfismus

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Jazyk C# (seminář 6)

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Základy programovaní 3 - Java. Unit testy. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. 26.,27.

Události. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Agenda. Docházka Návrat k minulému praktickému cvičení Zápočtové práce. Dokumentace. Dotazy, přání, stížnosti. Co, jak a proč dokumentovat

Testovací metoda. Testovací metoda. public class SimpleTest {

SW_10. Dekorátor - Decorator Stav - State

Programování v Javě I. Únor 2009

Vaše jistota na trhu IT. Balíčky. Rudolf Pecinovský

Distribuované systémy a výpočty

Technologie JavaBeans

Abstract Factory úvod

Programování v Javě I. Leden 2008

Transkript:

Výchozí a statické metody rozhraní Tomáš Pitner, upravil Marek Šabo

Výchozí a statické metody rozhraní Java 8 přidává ohledně metod v rozhraní nové možnosti. Neuvidíme je tedy ve starém kódu a mnozí vývojáři je neznají. S tím se nemusíme trápit, většinou se tyto postupy hodí pro modifikace stávajícího kódu a pro návrh nového kódu moc jen omezeně. Jde o možnosti, jak již do rozhraní přímo implementovat funkčnost, nenechávat to až na třídy. To trochu popírá základní princip, že v rozhraní funkční kód metod není. Proto to má omezené použití a nemělo by se zneužívat. Jsou dva nové základní typy metod: statické (static) výchozí (default) Statické metody Rozhraní může počínaje Java 8 obsahovat statické metody. Ty se píší i chovají stejně jako ve třídě, tj. nesmějí pracovat s atributy a metodami objektu, nýbrž jen celé třídy = dalšími statickými. void methodtoimplement(); static void somestaticmethod() { /* code inside */... A.someStaticMethod(); Výchozí metody rozhraní výchozí = default Přidávají možnost implementovat v rozhraní i určitou funkcionalitu. Hlavním smyslem je, aby se při přidávání metod do STÁVAJÍCÍHO rozhraní nenarušil stávající kód. Jestli přidáme novou metodu do STÁVAJÍCÍHO rozhraní, musíme ji ve všech STÁVAJÍCÍCH implementacích rozhraní implementovat, což znamená ve stávajících třídách dopisovat nové metody atd. To vyžaduje většinou brutální zásah do stávajícího kódu s riziky vnesené chyb (regrese), přináší pracnost apod. 1

Proto obvykle zpětně nepřidáváme do stávajícího rozhraní nic. Výchozí metody nám umožní udělat výjimku a něco tam přidat bez narušení stávajícího kódu, protože výchozí metody rovnou obsahují i svou (výchozí) implementaci. V definici rozhraní jsou výchozí metody uvozeny klíčovým slovem default a obsahují implementaci metody. Příklad public interface Addressable { String getstreet(); String getcity(); default String getfulladdress() { return getstreet() +", " + getcity(); Výchozí metodu můžeme samozřejmě ve třídách překrýt. TIP: Více informací: Java SE 8 s New Language Features Statické a výchozí metody Statické metody se mohou v rozhraní využít při psaní výchozích metod: static void somestaticmethod() { /* some stuff */ default void somemethod() { // can call static method somestaticmethod(); Významná použití výchozích metod Výchozí metody se mohou zdát zbytečností, ale je několik situací, kdy se velmi hodí: Vývoj existujících rozhraní: Dříve nebylo možné přidat do existujícího rozhraní metodu, aniž by všechny třídy implementující toto rozhraní musely implementovat i novou metodu. Jinak by stávající kód přestal fungovat. Zvýšení pružnosti návrhu Výchozí metody nás zbavují nutnosti použít abstraktní třídu pro implementaci obecných metod, které by se jinak v implementujících neabstraktních třídách 2

opakovaly. Abstraktní třída nutí nejen k implementaci, ale i k dědění, což narušuje javový koncept preferující implementaci rozhraní před dědičností tříd. Rozšiřování rozhraní s výchozí metodou Mějme rozhraní A obsahující nějakou výchozí metodu, třeba dm(). Definujeme-li nyní rozhraní B jako rozšíření (extends) rozhraní A, mohou nastat tři různé situace: 1. Jestliže výchozí metodu dm() v rozhraní B nezmiňujeme, pak se podědí z A. 2. V rozhraní B uvedeme metodu dm(), ale jen její hlavičku (ne tělo). Pak ji nepodědíme, stane se abstraktní jako u každé obyčejné metody v rozhraní a každá třída implementující rozhraní B ji musí sama implementovat. 3. V rozhraní B implementujeme metodu znovu, čímž se původní výchozí metoda překryje jako při dědění mezi třídami. Více výchozích metod chybně Následující kód Java 8 (a samozřejmě ani žádná starší) nezkompiluje. default void somemethod() { /*bla bla*/ interface B { default void somemethod() { /*bla bla*/ class C implements A, B { // překladač by nevěděl, kterou somemethod() použít Více výchozích metod překryté, OK Následující kód Java 8 (ale samozřejmě žádná starší) bez potíží zkompiluje. 3

default void somemethod() { /*bla bla*/ interface B { default void somemethod() { /*bla bla*/ class D implements A, B { // překryjeme-li (dvojitě) poděděnou metodu, není problém // překladač nemusí "přemýšlet", kterou somemethod() použít public void somemethod() { // the right stuff, this will be used Jedna metoda výchozí, druhá abstraktní Následující kód Java 8 opět nezkompiluje. Jedno rozhraní default metodu má a druhé ne. void somemethod(); interface B { default void somemethod() { /* whatever */ class E implements A, B { // nepřeloží, protože zůstává otázka: // má či nemá překladač použít výchozí metodu? Dokumentace Oracle The Java Tutorial: Default Methods 4