Návrhové vzory Tvorba objektů

Podobné dokumenty
Generické typy. Podrobněji: The Java Language Specification ( Third Edition ) , 18

Programování v jazyku Java RMI, vnitřní a vnořené třídy, generika

Parametrizované třídy Generics generické třídy. JDK zavádí mimo jiné tzv. parametrizované třídy - generics

Typický prvek kolekce pro české řazení

typová konverze typová inference

Generické programování

Generické programování v jazyce Java Generics programming in Java

Úvod do programovacích jazyků (Java)

JAVA. Zdrojové soubory

7. Dynamické datové struktury

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

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

Teoretické minimum z PJV

Java Enum Java, zimní semestr ,2017 1

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

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

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

20. Projekt Domácí mediotéka

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

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

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

Java. Generické typy

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

Java - řazení objektů

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

Jazyk C# (seminář 6)

JAVA V Assertions Java, zimní semestr

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

Abstraktní datové typy: zásobník

Seminář Java IV p.1/38

9. přednáška - třídy, objekty

Výčtový typ strana 67

Abstraktní třída a rozhraní

Java Výjimky Java, zimní semestr

Jazyk C# (seminář 3)

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

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/

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

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

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

PREPROCESOR POKRAČOVÁNÍ

Datové abstrakce v programovacích jazycích

UJO Framework. revoluční architektura beans. verze

KTE / ZPE Informační technologie

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

Algoritmizace a programování

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.

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

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

8 Třídy, objekty, metody, předávání argumentů metod

PŘETĚŽOVÁNÍ OPERÁTORŮ

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

Programování v jazyce Java. Tomáš Pitner, upravil Marek Šabo

Seminář Java II p.1/43

Principy objektově orientovaného programování

Vytváření a použití knihoven tříd

Programování v Javě I. Leden 2008

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

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

IRAE 07/08 Přednáška č. 7. Začátek (head)

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Novinky, s nimiž přichází Java 5.0

17. Projekt Trojúhelníky

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

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

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

Dědění, polymorfismus

Úvod do programovacích jazyků (Java)

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

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Java Řetězce Java, zimní semestr

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

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

Amaio Technologies, Inc., Třebohostická 14, Praha 10,

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

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

Testy z Javy verze 1.0 Stránka 1 z 13

Kolekce, cyklus foreach

Úvod Přetěžování Generika Kolekce Konec. Programování v C# Další jazykové konstrukce. Petr Vaněček 1 / 31

ADT/ADS = abstraktní datové typy / struktury

4IT101 otázky k závěrečnému testu verze pro zimní semestr 2007/2008

Programování v C++ 2, 4. cvičení

Programovací jazyk Java

1. Téma 12 - Textové soubory a výjimky

7. Datové typy v Javě

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

10 Generické implementace

1. Programování proti rozhraní

9. Polymorfismus a rozhraní

Dědičnost (inheritance)

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

OOP - Objektově Orientované Programování

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ápis programu v jazyce C#

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Třídy a objekty -příklady

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Transkript:

Objektové modelování, AD7B36OMO Návrhové vzory Tvorba objektů JIŘÍ ŠEBEK Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze https://edux.feld.cvut.cz/courses/ad7b36omo Přednáška je vytvořena na základě původních přednášek autorů: Karel Richta;Pavel Strnad, 2014

CO TO JSOU GENERIKA? UMOŽŇUJE POUŽÍVÁNÍ GENERICKÝCH TYPŮ PŘI DEKLARACI TŘÍD, ROZHRANÍ A METOD OD JDK 1.5

CO TO JSOU GENERIKA?

MOTIVACE CÍLEM JE: NEBÝT OMEZENI DATOVÝMI TYPY ROZŠÍŘENÍ TYPOVÉ KONTROLY VYUŽÍT KÓD OPAKOVANĚ S RŮZNÝMI DATOVÝMI TYPY

PŘÍKLAD SPOJOVÝ SEZNAM (JENDOSMĚRNÝ, OBOUSMĚRNÝ, CYKLICKÝ )

PŘÍKLAD SPOJOVÝ SEZNAM (JENDOSMĚRNÝ, OBOUSMĚRNÝ, CYKLICKÝ ) S GENERIKY

PŘÍKLAD SPOJOVÝ SEZNAM (JENDOSMĚRNÝ, OBOUSMĚRNÝ, CYKLICKÝ ) BEZ GENERIK S GENERIKY

PŘÍKLAD ARRAYLIST (VŠICHNI POUŽÍVÁME)

PŘÍKLAD LINKEDLIST (VŠICHNI POUŽÍVÁME) LinkedList<String> list = new LinkedList<String>(); list.add("abc"); String s = list.get(0); // není nutnost přetypovat LinkedList list = new LinkedList(); list.add("abc"); String s = (String)list.get(0); // nutné přetypování

DALŠÍ PŘÍKLAD SAMOZDŘEJME MŮŽEME VYUŽÍVAT DĚDIČNOST

GENERICKÉ TYPY JSOU TŘÍDY ČI INTERFACES DEKLARUJÍCÍ TZV. TYPOVÉ PARAMETRY JIMIŽ: SYSTEMATIZUJÍ TYPOVOU KONTROLU KOMPILÁTOREM, VYJADŘUJÍ JASNĚJI SMYSL, ZLEPŠUJÍ ČITELNOST A ROBUSTNOST PROGRAMU, ULEHČUJÍ PSANÍ PROGRAMU V IDE, V CLASS-SOUBORECH JSOU VYZNAČENY, ALE LZE JE POMINOUT ( TZV. ERASURE ), V RUNTIME SE NIJAK NEUPLATŇUJÍ TAM JSOU JEN TZV. HRUBÉ ( RAW ) TYPY. UŽÍVAJÍ SE ZEJMÉNA V KOLEKCÍCH K VYMEZENÍ TYPŮ PRVKŮ.

GENERICKÉ TYPY TYPOVÉ PARAMETRY LZE UŽÍT JEN NA REFERENČNÍ TYPY, ALE NIKOLI: - VE STATICKÉM KONTEXTU: STATIC VOID M( ) { LIST<T> LST= - POLE A VYTVOŘENÍ POLE: E[ ] E = ( E[ ] ) NEW OBJECT[5]; NEW E[3] NEW ARRAYLIST<STRING>[7] - PRIMITIVNÍ TYPY: LIST<INT> - STATICKÉ ATRIBUTY: STATIC T T - VYTVOŘIT INSTANCI: NEW E( ) - POTOMKY TŘÍDY THROWABLE: CLASS MYEX<T> EXTENDS EXCEPTION {

GENERICKÉ TYPY CLASS PAIR<K, V> { Pair<int, char> p = new Pair<>(8, 'a'); // compile-time error PRIVATE K KEY; Pair<Integer, Character> p = new Pair<>(8, 'a'); //OK PRIVATE V VALUE; PUBLIC PAIR(K KEY, V VALUE) { THIS.KEY = KEY; THIS.VALUE = VALUE; //...

GENERICKÉ TYPY PUBLIC STATIC <E> VOID APPEND(LIST<E> LIST) { E ELEM = NEW E(); // COMPILE-TIME ERROR LIST.ADD(ELEM); PUBLIC STATIC <E> VOID APPEND(LIST<E> LIST, CLASS<E> CLS) THROWS EXCEPTION { E ELEM = CLS.NEWINSTANCE(); // OK LIST.ADD(ELEM);

GENERICKÉ TYPY PUBLIC CLASS MOBILEDEVICE<T> { PRIVATE STATIC T OS; // NEMŮŽEME! //...

GENERICKÉ TYPY PUBLIC STATIC <E> VOID RTTI(LIST<E> LIST) { IF (LIST INSTANCEOF ARRAYLIST<INTEGER>) { // COMPILE-TIME ERROR //... PUBLIC STATIC VOID RTTI(LIST<?> LIST) { IF (LIST INSTANCEOF ARRAYLIST<?>) { // OK //...

SYNTAX HLAVIČEK... class JménoTřídy [ < Deklarace > ] // generická třída [ extends JménoNadTřídy [ < TypArgument,... > ] ] [ implements JménoInterfejsu [ < TypArgument,... > ],... ] {... interface JménoInterface [ < Deklarace > ] // generický interface [ extends JménoNadInterface [ < TypArgument,... > ],... ] {... [ < Deklarace > ] JménoTřídy // generický konstruktor ( [ [ final ] ( Typ TypParm ) jménoparametru,... ] ) {... [ [ static] [ final ] [ abstract ] ] // generická metoda [ < Deklarace > ] ( void ReturnTyp TypParm ) jménometody ( [ [ final ] ( Typ TypParm ) jménoparametru,... ] ) ( { ; ) < Deklarace > je seznam typových parametrů: < T 1, T 2,... T i,... T n > T i ve třídě či interface jsou globální a nelze je užít ve statickém kontextu, T i konstruktoru či metodě jsou lokální a lze je zastínit.

TYPOVÝ PARAMETR DEKLAROVANÝ V SEZNAMU < T 1, T2,... TI,... TN > MŮŽE BÝT VYMEZEN TAKTO: T I [ EXTENDS JAVA.LANG.OBJECT ] - JE JAKÁKOLI TŘÍDA. T I EXTENDS Z - Z JE JIŽ ZNÁMÁ TYPOVÁ PROMĚNNÁ. T I EXTENDS ( R I ) [ & I & I... ] - R JE TŘÍDA I INTERFACE & - LOGICKÝ SOUČIN. TYPOVÉ PARAMETRY SE OBVYKLE ZNAČÍ JEDNOPÍSMENNÝM IDENTIFIKÁTOREM: T, E, K, V, N, S, A PRO: TYPE, ELEMENT, KEY, VALUE, NUMBER, SERVICE, ACTION

TYPOVÝ PARAMETR PŘÍKLADY : CLASS DEMO < T, E EXTENDS Y & K, N EXTENDS J & K > { PUBLIC < Y, K > K DEMO( Y Y, K K, INT I ) { RETURN K; KDE Y JE NAPŘ. TŘÍDA J A K JSOU INTERFACES.

PARAMETRIZOVANÝ OBJEKT VYTVOŘÍ KONSTRUKTOR S TYPOVÝMI ARGUMENTY V POČTU A S VYMEZENÍM FORMÁLNÍCH PARAMETRŮ DLE DEFINICE TYPU: NEW DEMO < A, B, C > ( ) KDE A, B, C JSOU VHODNÉ REFERENČNÍ TYPY, TJ. TŘÍDY NEBO INTERFACE.

PARAMETRIZOVANÝ OBJEKT PARAMETRIZOVANÝ OBJEKT LZE REFEROVAT ČTYŘMI ZPŮSOBY: DEMO REF0 ; // RAW: OBJECT, OBJECT, OBJECT DEMO < A,B,C > REF1 ; // REF1: A,B,C REF1 = NEW DEMO < A,B,C > ( ) ; // DECORATED TYPE = NEW DEMO <> ( ) ; // INFERENCE DIAMANTEM <> OD V. 7 REF0 = REF1 ; // ERASURE REF0 = NEW DEMO ( ) ; // RAW TYPE REF1 = REF0 ; // UNCHECKED CONVERSION

Prvky v intervalu se musí umět porovnat Intervaly se mezi sebou musí umět porovnat

PŘÍKLAD: PARAMETRIZOVANÝ INTERVAL public class Interval... { //... low, high; public Interval(... ) { if ( low.compareto( high ) >0 ) throw new IllegalArgumentException( ); this.low=low; this.high=high; @Override public int compareto(...) { return this.low.compareto( that.low ); @Override public String tostring( ) { return "Interval["+low+","+high+"]";

PŘÍKLAD: PARAMETRIZOVANÝ INTERVAL public class Interval <E extends Comparable<E>> implements Comparable<Interval<E>> { E low, high; public Interval( E low, E high ) { if ( low.compareto( high ) >0 ) throw new IllegalArgumentException( ); this.low=low; this.high=high; @Override public int compareto( Interval<E> that ) { return this.low.compareto( that.low ); @Override public String tostring( ) { return "Interval["+low+","+high+"]"; class XI <E extends Comparable<E>> extends Interval<E> { public XI( E a, E b) { super(a,b);

TYPOVÝ ARGUMENT SE ŽOLÍKEM ( WILDCARD ) REFERENCE, TJ. PROMĚNNÉ A PARAMETRY METOD, LZE VYMEZIT JAKO MNOŽINU PŘIJATELNÝCH NEZNÁMÝCH TYPŮ TAKTO: <? [ EXTENDS TYP EXTENDS JAVA.LANG.OBJECT ] > - ZDE EXTENDS ZAHRNUJE I IMPLEMENTS TYP VYZNAČUJE HORNÍ MEZ VČETNĚ. NELZE VKLÁDAT NEBO MĚNIT HODNOTY ( KROMĚ NULL ) - JEN K NIM PŘISTUPOVAT ( A V KOLEKCÍCH I ODSTRAŇOVAT ). <? SUPER TYP > - TYP VYZNAČUJE DOLNÍ MEZ VČETNĚ. LZE VKLÁDAT HODNOTY.

TYPOVÝ ARGUMENT SE ŽOLÍKEM ( WILDCARD ) NAPŘ.: PRO VÝPIS LZE UŽÍT NEOMEZENÝ ŽOLÍK: VOID PRINTANY( LIST<? > C ) { // NE < OBJECT > FOR ( OBJECT O : C ) SYSTEM.OUT.PRINTLN( O ); C.GET( 0 ); C.ADD( NEW OBJECT( ) ); // LZE - NEMÁ PARAM. TYP // MÁ PARAM. E - COMPILE ERROR

? V REFERENCI ZADEFINUJEME TŘÍDY <- A <- B <- C <- D REFEROVANÉ PROMĚNÝMI A, B, C, D. CLASS BOX< V EXTENDS B > { // TATO KRABICE UMOŽNÍ ULOŽIT JEDNU VĚC V V ; // SPLŇUJÍCÍ: V INSTANCEOF B BOX ( V V ) { THIS.V = V; V GET( ) { RETURN V; VOID SET( V V ) { THIS.V = V; // NUTNO VLOŽIT B NEBO C NEBO NULL // VŽDY LZE VLOŽIT NULL

? V REFERENCI KRABICE SLOUŽÍ K ŘÁDNÉMU ULOŽENÍ, REFERENCE VYMEZUJE VKLAD A VÝBĚR VĚCÍ: BOX< B> X1=NEW BOX<>( B ); X1.SET( B ); B Z1=X1.GET(); BOX< C> X2=NEW BOX<>( C ); X2.SET( C ); C Z2=X2.GET(); BOX<? SUPER B > X3=NEW BOX<>( B ); X3.SET( B ); B Z3=X3.GET(); BOX<? SUPER C > X4=NEW BOX<>( B C ); X4.SET( C ); B Z4=X4.GET(); BOX<? EXTENDS B > X5=NEW BOX<>( B ); BOX<? EXTENDS C > X6=NEW BOX<>( C ); BOX<?[EXTENDS A] > X7=NEW BOX<>( B ); B Z5=X5.GET(); C Z6=X6.GET(); B Z7=X7.GET(); @ SUPPRESSWARNINGS( "RAWTYPES" ) // POTLAČENÍ PŘED METODOU ČI CLASS BOX X= NEW B<>( B C ); X.SET( B C ); B Z= X.GET( );

DALŠÍ PŘÍKLAD CLASS DEMO < X, Y EXTENDS NUMBER, Z EXTENDS ABSTRACTMAP < K, V > IMPLEMENTS NAVIGABLEMAP < K, V > { PRIVATE COMPARATOR<? SUPER K > COMPARATOR = NULL ; PUBLIC TREEMAP( COMPARATOR<? SUPER K > C) { COMPARATOR = C ; PUBLIC TREEMAP( MAP<? EXTENDS K,? EXTENDS V > M ) { PUTALL( M );... Upravte kód nahoře, aby se dal spustit kód zde: MAP < STRING, INTEGER > M = NEW TREEMAP < STRING, INTEGER > ( ) ; M.PUT ( "AAA", 1); INT I = M.GET ( "AAA" );

DALŠÍ PŘÍKLAD CLASS TREEMAP< K, V > EXTENDS ABSTRACTMAP < K, V > IMPLEMENTS NAVIGABLEMAP < K, V > { PRIVATE COMPARATOR<? SUPER K > COMPARATOR = NULL ; Co kdybychom chtěli dát podmínku na String a Integer? PUBLIC TREEMAP( COMPARATOR<? SUPER K > C) { COMPARATOR = C ; PUBLIC TREEMAP( MAP<? EXTENDS K,? EXTENDS V > M ) { PUTALL( M );... MAP < STRING, INTEGER > M = NEW TREEMAP < STRING, INTEGER > ( ) ; M.PUT ( "AAA", 1); INT I = M.GET ( "AAA" );

DALŠÍ PŘÍKLAD PARAMETRIZOVAT METODY LZE I V NEPARAMETRIZOVANÝCH TŘÍDÁCH I INTERFACES. PUBLIC STATIC < U EXTENDS DOUBLE, V > U M( U U, V V ) { U X = U; V Y = V; SYSTEM.OUT.PRINTLN( U.GETCLASS( ) +" "+ V.GETCLASS( ) ); SYSTEM.OUT.PRINTLN( X+" "+Y ) ; RETURN X;... NUMBER S = M ( 666.999, NEW STACK( ) ); DOUBLE D = M (.777, "BBB" ); OBJECT O = M ( 3.14, 3L ); Parametrizovaný konstruktor má smysl jen v parametrizovaných třídách. // ČÍSLA PŘEVÁDÍ AUTOBOXING

GENERIKA A SUBTYPY DŮLEŽITÁ, BYŤ NEITUITIVNÍ, ZÁBRANA PROTI NARUŠENÍ VYMEZENÍ: PRO VZTAH SUBTYP --> SUPERTYP ( EXTENDS / IMPLEMENTS ) NEPLATÍ: L<SUBTYP> --> L<SUPERTYP> PŘÍKLAD: CLASS DRIVER EXTENDS PERSON { LIST< DRIVER > DRIVERS = NEW ARRAYLIST<> ( ); LIST< PERSON > PEOPLE = DRIVERS; PEOPLE.ADD( NEW PERSON( ) ); // ERROR // NON-DRIVER IN DRIVERS

GENERIKA A SUBTYPY DŮLEŽITÁ, BYŤ NEITUITIVNÍ, ZÁBRANA PROTI NARUŠENÍ VYMEZENÍ: PRO VZTAH NEPLATÍ: SUBTYP --> SUPERTYP L<SUBTYP> --> L<SUPERTYP> PŘÍKLAD: CLASS DRIVER EXTENDS PERSON { LIST< DRIVER > DRIVERS = NEW ARRAYLIST<> ( ); LIST< PERSON > PEOPLE = DRIVERS; PEOPLE.ADD( NEW PERSON( ) ); // ERROR // NON-DRIVER IN DRIVERS

ERASURE PROCES VYNUCOVÁNÍ TYPOVÝCH OMEZENÍ POUZE PŘI KOMPILACI A VYŘAZENÍ INFORMACÍ O TYPU PRVKU PŘI BĚHU public static <E> boolean containselement(e [] elements, E element){ for (E e : elements){ if(e.equals(element)){ return true; return false; Před kompilací PUBLIC STATIC BOOLEAN CONTAINSELEMENT(OBJECT [] ELEMENTS, OBJECT ELEMENT){ FOR (OBJECT E : ELEMENTS){ IF(E.EQUALS(ELEMENT)){ RETURN TRUE; Po kompilaci RETURN FALSE;

ERASURE COLLECTION<STRING> CS = NEW ARRAYLIST <>( ); CS.ADD( AAA ) ; COLLECTION CR = CS; // RAW TYPE CR.ADD( 666 ) ; // UNSAFE OPERATION COLLECTION<?> CX = CS; COLLECTION<? SUPER STRING > CX.ADD( BBB ) ; CX = CS; // ERROR CX.ADD( CCC ) ; COLLECTION<? EXTENDS STRING > CY = CS; COLLECTION<OBJECT> CO = CS; CY.ADD( DDD ) ; // ERROR // ERROR INCOMPATIBLE TYPES

ERASURE - PŘÍKLAD NAPIŠTE TŘÍDU HETEROGENNÍ KOLEKCE, DO KTERÉ MŮŽEME VLOŽIT RŮZNÉ OBJEKTY, ALE BUDE SPLŇOVAT COMPARABLE (MÁ METODU COMPARE ;))

ERASURE - PŘÍKLAD LIST< COMPARABLE<? > > LIST = NEW ARRAYLIST<>( ); // VLOŽENÍ OBJEKTŮ RŮZNÝCH TŘÍD AVŠAK SPLŇUJÍCÍ COMPARABLE. COLLECTIONS.SORT( LIST, NEW MYCOMP( ) ); // ŘAZENÍ @ SUPPRESSWARNINGS( { "RAWTYPES" ) CLASS MYCOMP IMPLEMENTS COMPARATOR< COMPARABLE > { @ OVERRIDE @ SUPPRESSWARNINGS( { "UNCHECKED" ) PUBLIC INT COMPARE( COMPARABLE O1, COMPARABLE O2 ) { CLASS C1 = O1.GETCLASS( ), C2 = O2.GETCLASS( ); RETURN C1 == C2? - O1.COMPARETO( O2 ) // TÉŽE TŘÍDY : - C1.GETNAME( ).COMPARETO( C2.GETNAME( ) ); // RŮZNÝCH TŘÍD

CO GENERIKA NEUMÍ JEDNÁ SE O + NAD KOMPILÁTOREM (V BYTEKÓDU NEEXISTUJÍ). NEMŮŽEME POUŽÍVAT TYPOVÉ PARAMETRY ZA BĚHU PROGRAMU (V DANÝ OKAMŽIK JIŽ NEEXISTUJÍ).

REFLEXE JAK OBEJÍT ZAPOUZDŘENÍ PRIVATE STATIC VOID SET(OBJECT OBJECT, STRING VAR, OBJECT VALUE) THROWS NOSUCHFIELDEXCEPTION, ILLEGALARGUMENTEXCEPTION, ILLEGALACCESSEXCEPTION { FIELD F = OBJECT.GETCLASS().GETDECLAREDFIELD(VAR); F.SETACCESSIBLE(TRUE); F.SET(OBJECT, VALUE); // TODO: MŮŽEME ODCHYTÁVAT VÝJIMKY A VYHAZOVAT VLASTNÍ VÝJIMKU PŘÍPADNĚ BĚHOVOU

REFLEXE RYCHLOST PŘÍMÝ PŘÍSTUP: CELKOVÝČAS = 5 MS RELATIVNÍČAS = 100.00 % SETTER: CELKOVÝČAS = 5 MS RELATIVNÍČAS = 100.00 % REFLEXE: CELKOVÝČAS = 151 MS RELATIVNÍČAS = 3020.00 % REFLEXE PŘIPRAVENÁ: CELKOVÝČAS = 16 MS RELATIVNÍČAS = 320.00 % ABSOLUTNÍ ČASY JSOU PRO MILION OPAKOVÁNÍ POKUD NAJDEME FILED JEN POPRVÉ A POTÉ HO JEN VYUŽÍVÁME.