Richard Lipka, ZČU

Tato stránka vznikla primárně pro studenty předmětu UUR, aby je seznámila s některými funkcemi Eclipse, které mohou usnadnit a hlavně urychlit programování. Hodit se ale může každému kdo s Eclipse začíná. Nejde rozhodně o přehled všeho co umí, spíš o věci na které jsem časem narazil a začal používat. Předpokládám zde alespoň základní znalosti IDE, ponětí o tom co je to workspace, projekt v Eclipse a podobné věci. 

Řadu věcí které je otravné psát dokáže Eclipse generovat automaticky. Tuto funkci najdete v kontextovém menu pod heslem "Source", případně ji lze vyvolat zkratkou Alt+Shift+S. Objeví se vám něco jako

Menu "Source"

Komentáře

První sekce menu se hodí pro rychlé komentování. "Toggle Comment"  umí zakomentovat nebo odkomentovat aktuální řádku nebo výběr řádkovým komentářem - //. Pokud je vybraný blok zdrojového textu, objeví se ještě 

Menu s komentáři

"Add Block Comment", který dokáže zakomentovat celý vybraný úsek zdrojového textu. "Remove Block Comment" ostraní blokový komentář ve kterém je kurzor aktuálně umístěn (ať už je komentář jakkoliv velký). A konečně "Generate Element Comment" slouží k vytvoření dokumentačního komentáře pro Javadoc. Dokumentační komentář se vytváří pro element na kterém je aktuálně kurzor, a zajistí i vytvoření potřebných entit jako je @param nebo @return při komentování metod.

Formátování

Další sekce menu slouží pro formátování zdrojového textu.

Formátovací menu

Negeneruje sice žádný text, ale usnadní správné odsazování a formátování podle Javovských konvencí. "Correct Indentation" správně odsadí vybraný řádek nebo řádky. "Format" a "Format Element" zformátují text celého souboru (v případě "Format Element" jen elementu ve kterém je kurzor - je-li tedy v metodě formátuje se jen metoda a ne celý soubor). Provedou tedy nejen odsazení, ale zkontrolují i jestli jsou složené závorky na koncích řádek, na každém řádku jen jeden příkaz a podobně. Eclipse se sice snaží toto formátování udržet sám od sebe, ale pokud na něj nejste zvyklí nebo přeberete cizí, divně naformátovaný zdroják, může vám to pomoci. Navíc když se pak objeví chyba se špatným počtem uzavíracích závorek u složitých podmínek, je při správném formátování snáz vidět, kde vlastně chybí. 

Řazení a importy

Další část menu slouží jednak k organizaci importovaných tříd a packagů, jednak k řazení prvků třídy ve zdrojovém textu.

Menu s importy a řazením

"Add Import" jsem ve skutečnosti nikdy nepoužil, slouží pro přidání importu třídy na které je kurzor, pokud tato třída zatím není importována. Jinými slovy, pokud používte například ArrayList a nemáte ho importován, stačí umístit kurzor na jméno třídy ArrayList a zvolit "Add Import". Eclipse ale obvykle importuje potřebné třídy automaticky. Navíc, pokud nějaká závislost není splněna a import chybí, je možné využít rychlé opravy (menu se objeví po kliknutí na žárovičku s křížkem na levé straně
Menu rychlé opravy 
a v něm zvolit možnost "Import ArrayList").

"Organize imports" už se hodí častěji, zajistí pročištění všech importovaných závislostí. Pokud tedy importujete něco co nepoužíváte, "Organize imports" vás nepotřebného importu (a ošklivého warningu který je s ním spojený) zbaví.

"Sort Members" dělá přesně to, co byste od něj čekali - zajistí seřazení všech elementů ve třídě podle abecedy. Samozřejmě nemíchá atributy a metody, metody budou vždy až za atributy. Tahle funkce ale může být trochu zákeřná. Především, řazení podle abecedy může sice dávat smysl, ale stejně tak dává smysl seskupovat si k sobě metody spolu související metody, dávat privátní metody až za veřejné a podobné věci. Je dobré si vybrat co vám připadá lepší. Navíc, po spuštění řazení se objeví dialog

Varování při řazení

V základním nastavení se neřadí atributy, výčtové konstanty a inicializační bloky. Jejich přeházení totiž může změnit chování programu (jak ostatně dialog varuje), protože výpočty těchto prvků Javy probíhají v pořadí v jakém jsou napsané ve zdrojovém textu. Máte li například

private int b = 10;
private int a = b + 1;

přeřazení by vedlo k

private int a = b + 1;
private int b = 10;

a to naštěstí překladač nedovolí. 

Pořadí v jakém budou prvky řazeny za sebou můžete dokonce nastavit, w menu Window -> Preferences -> Java -> Appearance -> Members Sort Order.

Poslední funkce v této části je "Clean up" která se snaží "uklidit" váš zdrojový text od všech věcí které tam nepatří nebo narušují doporučené postupy, aniž by došlo k zásahu do fukncionality. V základním nastavení hlavně vyhází zbytečné importy a nepotřebná přetypování, co všechno má úklid dělat si ale můžete sami nakonfigurovat. Pro zatím se spokojte s defaultním nastavením. 

Generování

Teď se konečně dostáváme ke skutečnému generování nového zdrojového textu. 

Menu pro generování

"Override/Implement Methods" umožňuje překrývat metody které vaše třída zdědila, případně implementovat ty které jí předepisují její rozhraní. Po aktivaci se objeví menu 

Menu pro překrývání a implementaci metod

 ve kterém si můžete vybrat jaké metody budete překrývat nebo implementovat. Všimněte si dvouúrovňové hiearchie menu, na první úrovni jsou všechny třídy od kterých dědíte a všechna implementovaná rozhraní, na druhé pak metody. Třída Object bude předkem vždy. Pokud zašrtnete nějakou metodu, po potvrzení se do zdrojového textu přidá celá její hlavička a bude potřeba doplnit jen její tělo. 

Pod seznamem metod vidíte možnost volby kam se mají nově generované metody vložit (za jaký stávající prvek ve vaší třídě). Ve spodní části dialogu je odkaz na nastavení šablon, podle kterých se metody generují. Zatím se spokojte s výchozím.

Další funkce, "Generate Getters and Setters" slouží pro generování oblíbených getrů a setrů, tedy metod pro přístup k privátním atributům třídy (kterých by měla být valná většina). Po spuštění se objeví menu

Menu pro generování getrů a setrů

ve kterém si můžete vybrat pro které atributy se přístupové metody budou generovat. Těla metod lze později samozřejmě libovolně měnit. 

Třetí funkce, "Generate hashCode() and equals()" vytvoří automaticky právě tyto metody včetně jejich těl. V konfiguračním dialogu

Dialog pro generování hashCode() a equls() metod

si můžete vybrat které z atributů budou pro tvorbu hashcode a porovnání objektů použity. Není nutné aby to byly všechny, ale měli byste vybrat ty reprezentativní. 

Equals() zohlední při porovnání všechny atributy které vyberete - bude tedy považovat za stejné objekty, které mají stejné hodnoty zvolených atributů. Je dobré nechat zaškrtnuté "Use instanceof to compare types", kontrola typu se totiž provede před pokusem o přetypování a zabráníte tak vyskočení výjimky ClassCastException (je jisté, že pokud porovnáváte instance dvou různých tříd, equals by nemělo vrátit true - pokud k tomu nemáte nějaký zvláštní důvod). Pokud je vybraný atribut netriviálního typu (tedy reference na jiný objekt), provede se porovnání voláním příslušné equals() metody.

HashCode() generovaný Eclipsem je rozhodně dobře použitelný a pokud nevíte o lepším způsobu jak ho implementovat, nebojte se ho použít. Pokud je jedním z atributů pro generování hashCode reference, použije se hodnota její hashCode() metody.

Podobně funguje i další možnost, generování metody toString(). I zde se objeví dialog, kde si můžete vybrat co všechno se v toSting() metodě má použít.

Dialog pro volbu složek toString() 

Všimněte si, že kromě atributů (Fields) zde můžete zaškrtnout i metody a do výpisu toString zahrnout jejich návratovou hodnotu. Užitečná je možnost (poslední z checkboxů) omezit počet vypisovaných prvků polí na nějakou konkrétní hodnotu, aby vytvářené stringy nebyly příliš dlouhé. Samozřejmě, pokud s metodou toString() máte nějaké plány, nejspíš ji stejně budete chtít implementovat sami (případně se můžete pokusit upravit její šablonu), jestli ale toString() chcete jen pro nějaké ladící výpisy, je Eclipsem generovaná podoba celkem dobře použitelná. 

Poslední dvě položky slouží ke generování konstruktorů. Máte možnost vytvořit konstruktor z atributů třídy (Generate Constructor using Fields) nebo využít konstruktory nadřazených tříd - předků (Generate Contructor using Superclass). 

Při vytváření konstruktoru z atributů máte možnost zvolit si které atributy budou vyplněny. 

Dialog pro tvorbu konstruktoru

Atributy které vyberete budou parametry konstruktoru a po jeho zavolání se nastaví na předané hodnoty. Všimněte si, že hned na začátku dialogu je možnost vybrat si, jaký konstruktor nadřazené třídy (předka) se bude volat. Pokud má vybraný konstruktor nějaké parametry, budou tyto parametry samozřejmě i v hlavičce nového konstruktoru, aby je bylo možné při volání super() použít. 

Poslední možnost, generování konstruktoru nadřazené třídy slouží jen k vytvoření konstruktorů kopírujících konstruktory rodiče. 

Dialog pro generování konstruktorů rodiče

V tomto případě dostanete v dialogu na výběr které konstruktory předka chcete mít i v potomkovi, Eclipse je vygeneruje s příslušnými parametry a vloží odpovídající volání super(). Tato možnost se může hodit když předek nemá implicitní konstruktor a potřebujete mu nějaký vytvořit, aniž byste chtěli nastavit nějaký z atributů potomka. 

Externalizace

Externalizace je poslední položkou v menu pro generování zdrojového textu a její význam plně doceníte až během semestru, po přednášce o lokalizaci aplikace. 

Menu pro externalizaci řetězců

Zjednodušeně jde o to, že Java poskytuje mechanismy, které umožňují všechny řetězcové konstanty (tedy typicky texty které má aplikace vypisovat, vkládat do tlačítek, oken a podobně) vložit do samostatného souboru a z něj je potom načítat. Takový soubor je pak celkem snadné překládat (překladatel totiž nemusí zasahovat do zdrojového textu programu, jen překládá) a poskytnout v různých jazykových mutacích. Také je možné provídět korektury textů bez nutnosti nového překladu aplikace. Zdrojový text je pak o něco méně přehledný, tam kde byl původně text bude teď volání které má text získat ze třídy, která se stará o načtení souboru s texty. například místo

JButton button = new JButton("OK");

tedy bude něco jako

JButton button = new JButton(Messages.getString("Rectangle.okButton")); //$NON-NLS-1$ .

O vytvoření všeho potřebného se Eclipse umí postarat automaticky. Po spuštění externalizace se nejprve objeví

Dialog pro externalizaci - volba klíčů

Eclipse prohledá celou Vaši třídu a najde v ní všechny řetězce. Můžete se na ně podívat v seznamu, pod ním pak máte náhled kde se ve vašem zdrojovém textu nachází. Defeaultně jsou všechny označeny jako kandidáti na externalizaci, můžete ale jejich zaškrtnutí zrušit a ignorovat je, pokud nechcete aby se provedla jejich externalizace (např. když konstruujete SQL dotaz ze stringů, není rozhodně dobré nechat ho v souboru do kterého může potenciálně kdokoliv zasáhnout). Ve druhém sloupci (Value) vidíte aktuální řetězec, ve třetím (Key) můžete nastavit jeho označení. Eclipse je v defaultním nastavení čísluje, ale je dobré si klíče nastavit tak, aby z nich bylo poznat jaké řetězce jsou pod nimi ukryté. Přece jen je rozdíl když máte pochopit co dělá

JButton button = new JButton(Messages.getString("Rectangle.okButton")); //$NON-NLS-1$ 

JButton button = new JButton(Messages.getString("Rectangle.0")); //$NON-NLS-1$ .

Po kliknutí na next se objeví seznam potenciálních problémů (např. při prvním spuštění externalizace je to informace o tom, že soubor pro texty zatím neexistuje a musí se vytvořit) a pak přehled všech změn které se provedou.

Menu pro externalizaci - potvrzení změn

V horním panelu vydíte seznam všech změn (vytvářené soubory, úpravy stávajících tříd) s checkboxem - každou z nich můžete zrušit, pokud ji nechcete provést. Ve spodní části pak vidíte jak se změna projeví ve zdrojovém textu, vlevo je původní podoba a vpravo nová podoba Vašeho programu. Teprve po potvrzení tohoto dialogu se změny provedou. Eclipse vám tedy dává možnost všechno pořádně zkontrolovat, abyste neexternalizovali něco co nechcete. 

Generování konstrukcí jazyka

Kromě uvedených generátorů dokáže Eclipse pomoci i s generováním základních konstrukcí jazyka Java. Pokud napíšete (nebo začnete psát) klíčové slovo (if, while, switch, for, try, do ...) a stisknete CTRL + mezerník pro vyvolání nápovědy, nabídne vám Eclipse příslušnou předpřipravenou strukturu. Zejména užitečné je to u for cyklu, u kterého Eclipse nabízí vytvoření cyklu procházejícího poslední deklarované pole nebo kolekci.

Nabídka pro generování FOR cyklu

V levé části vidíte nabízené možnosti kontextového doplňování, v pravé je co se doplní při daném výběru. 

Hodí se také znát zkratky pro výpisy do konzole. Pokud napíšete

  • syserr nabídne Eclipse generování System.err.println();
  • sysout nabídne Eclipse generování System.out.println();
  • systrace nabídne Eclipse výpis aktuální pozice ve zdrojovém textu (v jaké jsem metodě), např. System.out.println("Rectangle.main()")

Jak vidíte, Eclipse toho dokáže vygenerovat celkem velké mnosžví, aniž byste museli cokoliv skutečně udělat. Proto také není úplně ideální metrikou produktivity práce programátora počet napsaných řádek. To užitečné se může smrsknout jen na pár řádek, které je třeba doplnit na správná místa generovaných konstrukcí - a na tom jak dobře dokážete tyto řádky vymyslet závisí jak jak dobří jste programátoři. 

Richard Lipka, ZČU
nach oben