<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-35730132</atom:id><lastBuildDate>Wed, 08 Apr 2009 13:46:15 +0000</lastBuildDate><title>Java Source</title><description></description><link>http://java-source.blogspot.com/</link><managingEditor>noreply@blogger.com (Ondřej Kvasnovský)</managingEditor><generator>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-35730132.post-5559594201307599615</guid><pubDate>Tue, 02 Sep 2008 19:43:00 +0000</pubDate><atom:updated>2008-09-02T22:00:54.910+02:00</atom:updated><title>Java books</title><description>A lot of people is asking me to recommend some books to read. Here is the list of those.&lt;br /&gt;&lt;br /&gt;I have read these books about Java:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ucebnice jazyka Java (CZE) - Pavel Herout&lt;/li&gt;&lt;li&gt;Thinking in Java (ENG) - Bruce Eckel&lt;/li&gt;&lt;li&gt;Java programujeme profesionalne (CZE) - Brett Spell&lt;/li&gt;&lt;li&gt;Java nastroje (CZE) - Martin Hynar&lt;/li&gt;&lt;li&gt;Java servlety a stranky JSP (CZE) - Marty Hall&lt;/li&gt;&lt;li&gt;Programujeme Jakarta Struts (CZE) - Chuck Caveness&lt;/li&gt;&lt;li&gt;Java 5 (CZE) - Rudolf Pecinovsky&lt;/li&gt;&lt;li&gt;SCJP 5 (ENG)&lt;/li&gt;&lt;/ul&gt;What was the best?&lt;br /&gt;&lt;ol&gt;&lt;li&gt;SCJP 5 (ENG)&lt;/li&gt;&lt;li&gt;Java 5 (CZE) - Rudolf Pecinovsky&lt;/li&gt;&lt;li&gt;Thinking in Java (ENG) - Bruce Eckel&lt;/li&gt;&lt;li&gt;Java programujeme profesionalne (CZE) - Brett Spell&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;I will add another info this week... That is all for today :~)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35730132-5559594201307599615?l=java-source.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://java-source.blogspot.com/2008/09/java-books.html</link><author>noreply@blogger.com (Ondřej Kvasnovský)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-35730132.post-1884381294315063101</guid><pubDate>Wed, 30 Jul 2008 08:23:00 +0000</pubDate><atom:updated>2008-07-30T10:25:56.732+02:00</atom:updated><title>Something to read</title><description>http://www.eclipsezone.com/eps/10minute-rcp/&lt;br /&gt;http://wiki.eclipse.org/index.php/Rich_Client_Platform&lt;br /&gt;http://www.onjava.com/pub/a/onjava/2006/08/23/eclipse-rich-client-platform.html&lt;br /&gt;http://www.vogella.de/articles/RichClientPlatform/article.html&lt;br /&gt;http://ianskerrett.blogspot.com/2005/12/when-to-use-eclipse-rcp.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35730132-1884381294315063101?l=java-source.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://java-source.blogspot.com/2008/07/something-to-read.html</link><author>noreply@blogger.com (Ondřej Kvasnovský)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-35730132.post-2518574277518060970</guid><pubDate>Fri, 15 Feb 2008 07:17:00 +0000</pubDate><atom:updated>2008-03-07T15:27:48.601+01:00</atom:updated><title>WTF?</title><description>One friend of mine found and sent me the following code snippet :~)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);font-family:courier new;" &gt;return new Boolean("1".equals(session.getSetting(&lt;br /&gt;SettingsConstants.DUMY)) ? true : false).booleanValue();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Unbelievably! To good to be true :~)&lt;a href="http://slovnik.seznam.cz/?q=too%20good%20to%20be%20true&amp;amp;lang=en_cz"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35730132-2518574277518060970?l=java-source.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://java-source.blogspot.com/2008/02/wtf.html</link><author>noreply@blogger.com (Ondřej Kvasnovský)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-35730132.post-697687113309712947</guid><pubDate>Sun, 06 Jan 2008 19:02:00 +0000</pubDate><atom:updated>2008-02-15T08:24:52.870+01:00</atom:updated><title>Java 7</title><description>If you are interested in Java check the following link...&lt;br /&gt;&lt;a href="http://tech.puredanger.com/java7"&gt;http://tech.puredanger.com/java7&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35730132-697687113309712947?l=java-source.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://java-source.blogspot.com/2008/01/java-7.html</link><author>noreply@blogger.com (Ondřej Kvasnovský)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-35730132.post-1989994358016013593</guid><pubDate>Sun, 03 Dec 2006 13:22:00 +0000</pubDate><atom:updated>2006-12-12T10:58:28.914+01:00</atom:updated><title>Kolekce v jazyku Java</title><description>Kolekce v programovacím jazyku Java slouží k ukládání, procházení (výběr) a mazání prvků. Java poskytuje několik typů kolekcí pro tuto funkčnost. Všechny však mají něco společného, mají společné rozhraní&lt;span style="font-style: italic;"&gt; java.util.Collection &lt;/span&gt;(snad až na Map, TreeMap, SortedMap a příbuzné). &lt;span style="font-style: italic;"&gt;Collection &lt;/span&gt;definuje základní metody pro práci nad kolekcemi.&lt;br /&gt;&lt;br /&gt;&lt;strong style="font-weight: normal;"&gt;Collection&lt;/strong&gt; je základní rozhraní, od kterého dědí všechny ostatní rozhraní pro kolekce. Jaké třídy implementují rozhraní Collection můžeme nalézt v Java API (&lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/"&gt;http://java.sun.com/j2se/1.5.0/docs/api/&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Když porovnáte kolekce v Java 5 s kolekcemi v Java 1.4, tak zásadní změna je v obohacení o parametrizované typy. Dále přibyly další kolekce.&lt;br /&gt;&lt;br /&gt;Ve starších verzích Javy (verze 1.1) byla dostupná pouze kolekce Vector. Vector se dal procházet buď indexově (jako pole) nebo pomocí Enumeration. V několika knihách jsem se dočetl, že Vector je zastaralý a neměl by se používat. Měl by se, podle nich, na místo Vector použít ArrayList. Abych Vector neoprávněně neodsuzoval, udělal jsem si malý výkonnostní test a vyšlo mi, že Vector je pomalejší od ArrayList o nějakých cca 10%. Není to ovšem vina špatných algoritmů, nebo špatné implementace. Je to proto, že Vector je serializovaný a ArrayList nikoli. Proto Vector není nijak zastaralý a odsouzený k zániku. Je nevýkonný tehdy, když ho použijete na špatném místě. Jak to bývá ostatně kdykoli, když se používají nesprávné postupy, když člověk neví co přesně a proč dělá. Kdyby ho autoři jazyka nechtěli, tak by ho snad daly alespoň deprecated.&lt;br /&gt;Proto řeči "Já mám raději ArrayList, protože je novější, Vector je zastaralý a pomalý!" jsou neopodstatněné.&lt;br /&gt;&lt;br /&gt;Od verze 1.2 byly do Javy přidány další kolekce a byla rozšířena jejich funkčnost.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Základní rozdělení v rozhraní (s příslušnými podtřídami):&lt;/span&gt;&lt;br /&gt;1. &lt;span style="font-style: italic;"&gt;Collection&lt;/span&gt;&lt;br /&gt;1.1 &lt;span style="font-style: italic;"&gt;List &lt;/span&gt;(ArrayList, Vector, Stack)&lt;br /&gt;1.2 &lt;span style="font-style: italic;"&gt;Set &lt;/span&gt;(HashSet, LinkedHashSet)&lt;br /&gt;1.2.1 &lt;span style="font-style: italic;"&gt;SortedMap &lt;/span&gt;(TreeSet)&lt;br /&gt;1.3 &lt;span style="font-style: italic;"&gt;Queue &lt;/span&gt;(LinkedList)&lt;br /&gt;2 &lt;span style="font-style: italic;"&gt;Map &lt;/span&gt;(SortedMap, HashMap, LinkedHashMap, Hashtable, WeakHashMap)&lt;br /&gt;2.1 &lt;span style="font-style: italic;"&gt;SortedMap &lt;/span&gt;(TreeMap)&lt;br /&gt;&lt;br /&gt;Seznam není úlpný a ani není třeba ho ani doplňovat. Například v seznamu chybí kolekce pro Enum, ale o těch bych se chtěl rozepsat někdy jindy a podrobněji. Pro to, jaké kolekce nám Java poskytuje se stačí podívat do API.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Nyní si popíšeme a ukážeme vhodné použití kolekcí. &lt;/span&gt;Při popisu nebudu vypisovat všechny metody, které kolekce poskytují. Budu se více zaměřovat na funkcionalitu, vhodné použití a optimalizaci.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. ArrayList&lt;/span&gt;&lt;br /&gt;ArrayList je jedna ze základních kolekcí. Je to třída, která implementuje rozhraní &lt;span style="font-style: italic;"&gt;List&lt;/span&gt;. Jednoduše se dá říct, že je to dynamické (nafukovací) pole. O bufferování ArrayListu se můžeme prosadit sami, nebo to nechat na automatické správě bufferu ArrayListu.&lt;br /&gt;Pokud chceme a víme, že budeme potřebovat vložit do ArrayList 10 000 prvků hned při vložení, ArrayList patřičně inicializujeme: new ArrayList(10000). Pokud nevíme kolik prvků bude vloženo do kolekce (a víme, že jich moc nebude) inicializujeme třídu ArrayList výchozím postupem: new ArrayList().&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Příklad:&lt;/span&gt; Při vytvoření ArrayList se inicializuje pole o velikosti například 1 000. Až vyplníme kolekci (pole), vytvoří se jiné větší pole, do kterého se překopíruje obsah předchozího pole. A můžeme pokračovat v plnění. Jde vidět, že se ArrayList chová jako StringBuffer.&lt;br /&gt;&lt;br /&gt;Pokud bychom chtěli aplikaci &lt;span style="font-weight: bold;"&gt;optimalizovat a vyladit práci s kolekcemi&lt;/span&gt;, můžeme si napsat malý statistický program. Ten by nám zjišťoval jaká je počáteční velikost, velikost po naplnění a velikost po některém dalším přidání prvků. Z toho bychom viděli a měli přesný přehled s jakou hodnotou inicializovat ArrayList.&lt;br /&gt;&lt;br /&gt;Další věc, kterou bychom měli dodržovat a každé rozumné IDE to vyžaduje, je vytvářet &lt;span style="font-weight: bold;"&gt;typově bezpečné kolekce&lt;/span&gt;. Když nebyly generické typy (parametrizované typy, šablony, ...) vytvářely se třídy, které zaobalily kolekcí a nedovolily nikomu vložit do kolekce dva nebo více různých typů.&lt;br /&gt;Zjednodušeně něco jako toto:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class StringArrayList {&lt;br /&gt;private &lt;span style="font-style: italic;"&gt;List &lt;/span&gt;list = new ArrayList();&lt;br /&gt;public void add(String s) {&lt;br /&gt;list.add(s);&lt;br /&gt;}&lt;br /&gt;public String get(int i) {&lt;br /&gt;return (String) list.get(i);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;S použitím generických typů se všechno zjednodušuje a odpadá nutnost implementovat tuto třídu. Typově bezpečnou kolekci vytvoříme takto: &lt;code&gt;&lt;br /&gt;List &amp;lt;String&gt; list = new ArrayList &amp;lt;String&gt;()&lt;/code&gt;.&lt;br /&gt;O tom co to znamená jsem už něco napsal, tak se na to teď &lt;a href="http://java-source.blogspot.com/2006/12/blog-post.html"&gt;odkazuji&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Vector&lt;/span&gt;&lt;br /&gt;Vector má stejně jako ArrayList stejné předky. Liší se od ArrayListu tím, že je synchronizovaný.&lt;br /&gt;&lt;br /&gt;3. Stack&lt;br /&gt;4. HashSet&lt;br /&gt;5. LinkedHashSet&lt;br /&gt;6. TreeSet&lt;br /&gt;7. LinkedList&lt;br /&gt;8. SortedMap&lt;br /&gt;9. HashMap&lt;br /&gt;10. LinkedHashMap&lt;br /&gt;11. Hashtable&lt;br /&gt;12. WeakHashMap&lt;br /&gt;13. TreeMap&lt;br /&gt;&lt;spa&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;/spa&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35730132-1989994358016013593?l=java-source.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://java-source.blogspot.com/2006/12/kolekce-v-programovacm-jazyku-java.html</link><author>noreply@blogger.com (Ondřej Kvasnovský)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-35730132.post-116107441729924279</guid><pubDate>Fri, 01 Dec 2006 08:26:00 +0000</pubDate><atom:updated>2007-03-26T09:39:33.332+02:00</atom:updated><title>Generické DAO</title><description>Nač použít generické typy? Tak například pro vytvoření generického DAO návrhového vzoru.&lt;br /&gt;Když napíšeme DAO pomocí generických typů, můžeme pak ukládat jakékoli třídy. Samozřejmě že předním musíme nějak pro databázi namapovat. To by ovšem mělo být v moci daného DAO.&lt;br /&gt;&lt;br /&gt;Nejdříve vytvoříme interface, a nadefinujeme jak naše DAO objekty budou vypadat. Dále přidáme generické typym kde "T" bude představovat ukládaný objekt, a "N" bude id (klíč) k danému objektu.&lt;span style="font-family:monospace;"&gt;&lt;/span&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;public interface GenericDao &amp;lt;T, N extends Serializable&gt; {&lt;br /&gt;N create(T o);&lt;br /&gt;T read(N id);&lt;br /&gt;void update(T o);&lt;br /&gt;void delete(T o);&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Po té co je interface hotov tak můžeme začít s jeho implementací. Následující implementace bude pro Hibernate. Samozřejmě že to můžeme naimplentovat jak chceme, a tady je jeden ze způsobů.&lt;br /&gt;&lt;code&gt;public class GenericDaoHibernate &amp;lt;T, N extends Serializable&amp;gt; implements GenericDao &amp;lt;T, N&amp;gt; {&lt;br /&gt;&lt;br /&gt;private Class type;&lt;br /&gt;&lt;br /&gt;public GenericDaoHibernateImpl(Class type) {&lt;br /&gt;this.type = type;&lt;br /&gt;}&lt;br /&gt;public N create(T o) {&lt;br /&gt;return (N) HibernateUtil.getSession.save(o);&lt;br /&gt;}&lt;br /&gt;public T load(N id) {&lt;br /&gt;return (T) HibernateUtil.getSession.load(type, id);&lt;br /&gt;}&lt;br /&gt;public void update(T o) {&lt;br /&gt; HibernateUtil.getSession.update(o);&lt;br /&gt;}&lt;br /&gt;public void delete(T o) {&lt;br /&gt; HibernateUtil.getSession.delete(o);&lt;br /&gt;}&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Jde vidět, že používáme třídu HibernateUtil, ta slouží pro poskytování přístupu do databáze. Ve skutečnosti jen poskytuje Session, která nám umožňuje pracovat s databází.&lt;br /&gt;&lt;br /&gt;Jak jde vidět generické typy při vhodném použití poskytují mocný nástroj pro vývoj.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35730132-116107441729924279?l=java-source.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://java-source.blogspot.com/2006/10/generic-dao.html</link><author>noreply@blogger.com (Ondřej Kvasnovský)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-35730132.post-866421923830066145</guid><pubDate>Fri, 01 Dec 2006 08:01:00 +0000</pubDate><atom:updated>2006-12-01T21:21:45.899+01:00</atom:updated><title>Generické typy</title><description>Když jsem si stáhnul a nainstaloval Java 5 na svůj počítač, byl jsem zvědavý jaké nové funkčnosti nám tato nová verze přinese. Okamžitě jsem si koupil knížku od Rudolfa Pecinovského, "Java 5.0 - Novinky jazyka a upgrade aplikací" a pustil jsem se do objevování co nového je.&lt;br /&gt;&lt;br /&gt;Zajimavé jsou všechny nové funkčnosti. Až snad na enum, ty nepracují tak jak mají a když se snažíte o serializaci, tak se Vám nepodaří nalézt nastavené hodnoty. Zkrátka enum v Jave pořádně nefungují. Proto budeme muset jestě nějakou dobu používat vlastnoruční enumy.&lt;br /&gt;&lt;br /&gt;O čem jsou generycké typy? Jednodušše řečeno, generické typy slouží pro vytváření abstraktních znovu použitelných typů. Tím se stává třída velmi mocná. Využít toho lze pro vytváření znovu použitelných tříd (například lze vytvořít "Generické DAO") . Dálší z hlavních funkčností je vytvoření typově bezpečných kolekcí.&lt;br /&gt;&lt;br /&gt;Jak lze využít generických typů pro zajištění typově bezpečných kolekcí můžeme vidět v následujícím kódu.&lt;br /&gt;&lt;br /&gt;Tato konstrukce nám zajistí typovou bezpečnost kolekce, to znamená, že pokud se pokusíme přidat do těchto kolekcí něco jiného něz jsme nadefinovaly, nepodaří se nám to ani zkompilovat natož spustit. Následující výpis kódu ukazuje jak toto vhodně použít.&lt;br /&gt;&lt;code&gt;List&amp;lt;String&gt; stringList = new ArrayList&amp;lt;String&gt;();&lt;br /&gt;stringList.add("retezec");&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Zde je ukázka pokusu vložit objekt jiného typu do typově bezpečné kolekce. Tato snaha skončí neuspěšným pokusem o přeložení.&lt;br /&gt;&lt;code&gt;stringList.add(new Integer(0));&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Co se děje na pozadí při vložení objektu správného typu? Překladač, jednoduše řečeno, udělá následné.&lt;br /&gt;&lt;code&gt;List stringList = new ArrayList();&lt;br /&gt;stringList.add("retezec");&lt;/code&gt;&lt;br /&gt;Nebo by se dalo říct, že jen ořeže kolekci od generických typů. A proč? Hlavní je zajistit, aby programor nevědomky (nebo snad ne umyslně) neplnil kolekci jiným typem. Doposud to šlo řešit tak že se vytvořila třída, která zaobalila kolekci svými metodami a zajistila tak typovou bezpečnost, zatím co kolekce byla pro okolí neviditelná. &lt;br /&gt;&lt;br /&gt;Pro to, co lze nyní napsat jedním řádkem se musela napsat celá třída. Zjednodušeně by se dalo říct, že jde v tomto případě jen pro programátorovo pohodlí.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35730132-866421923830066145?l=java-source.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://java-source.blogspot.com/2006/12/blog-post.html</link><author>noreply@blogger.com (Ondřej Kvasnovský)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-35730132.post-116038290787933138</guid><pubDate>Wed, 29 Nov 2006 22:34:00 +0000</pubDate><atom:updated>2006-12-13T20:27:31.025+01:00</atom:updated><title>Java - String a metoda intern()</title><description>Jelikož se na různých místech v aplikaci vyskytují co do obsahu stejné řetězce, tak aby nedocházelo k plýtvání pamětí a ke ztrátám na výkonu režijemi, udržuje si Java tyto řetězce ve speciálním pool. Stejné řetězce jsou po nějaké "chvíli" po vytvoření, jestli ne hned, uloženy do tohoto pool. Když si tedy zažádáme (např.: vytváříme String s = "HelloWorld") o nějaký takový řetězec, je nám vrácen ten, který byl do poolu uložen.&lt;br /&gt;Příklad:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;String helloWorld = "HelloWorld";&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;helloWorld = &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;helloWorld&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.intern();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;intern() - &lt;/span&gt;Tato metoda souvisí s tím, že String se v aplikacích docela často používá a má proto trochu speciální zacházení ze strany překladače i JVM. Z důvodu výkonostního.&lt;br /&gt;&lt;br /&gt;Metoda &lt;span style="font-style: italic;"&gt;intern()&lt;/span&gt; dělá to, že uloží řetězec do tohoto poolu, nebo pokud už tam jiný String se stejným obsahem je, vrátí ten String z poolu. Ten speciální případ, kdy s používá pool je, když vytvoříte nový String pomocí literálu v Javě, tedy např.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;String helloWorld = "HelloWorld";&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Metoda &lt;span style="font-style: italic;"&gt;intern()&lt;/span&gt; tedy slouží k uložení do poolu pro případ, že String vznikl nějak jinak. Celé to má význam pro ušetření paměti a urychlení porovnání Stringů (metodou equals()). Když vytvoříte dva Stringy se stejným obsahem &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;String helloWorld = "HelloWorld";&lt;/span&gt; &lt;span style="font-family:arial;"&gt;a &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;String helloWorld2 = "HelloWorld";&lt;/span&gt;&lt;br /&gt;bude to ve skutečnosti jeden objekt a ušetří se paměť. Při porovnání na &lt;span style="font-style: italic;"&gt;equals()&lt;/span&gt;, se nejprve porovná identita (==) a teprve pokud nesouhlasí, porovnává se znak po znaku. Z toho plyne, že pokud jde o dva stejné objekty, porovnání na identitu je rychlejší.&lt;br /&gt;&lt;br /&gt;Na druhé straně, využití metody &lt;span style="font-style: italic;"&gt;inter()&lt;/span&gt; není tak akutní jak se zdá. Jednak vyvolání&lt;span style="font-style: italic;"&gt; String.intern()&lt;/span&gt; nějakou dobu trvá a jednak není dost jasné jak se algoritmus pro ulkádání řetězců zachová.&lt;br /&gt;&lt;br /&gt;Nabízejí se tedy dvě možnosti:&lt;br /&gt;1. První je zavolat na String &lt;span style="font-style: italic;"&gt;intern()&lt;/span&gt; a zaručit že String zůstane v poolu navěky. Tímto postupem by mohla dojít paměť...&lt;br /&gt;2. Za druhé String, na který bylo zavoláno &lt;span style="font-style: italic;"&gt;intern()&lt;/span&gt; zůstáva v pool do té doby, dokud je na něj reference. Tím je volání metody &lt;span style="font-style: italic;"&gt;intern() &lt;/span&gt;více méně zbytečné a volání této metody vás jen brzdí.&lt;br /&gt;&lt;br /&gt;Využívat &lt;span style="font-style: italic;"&gt;intern()&lt;/span&gt; je tedy vhodné jen tehdy, když víte že daný řetězec v paměti potřebujete a chcete vědět, že ho tam i máte.&lt;br /&gt;&lt;br /&gt;A kdo tedy pochopil o co jde, bude schopen správně udělat následující test. Co vypíše následující kód?&lt;br /&gt;&lt;br /&gt;String hello1 = "hello";&lt;br /&gt;  &lt;br /&gt;  String hello2 = new String("hello");&lt;br /&gt;  &lt;br /&gt;  System.out.println(hello1 == hello2);&lt;br /&gt;&lt;br /&gt;  System.out.println(hello1 == (String)hello2);&lt;br /&gt;  &lt;br /&gt;  System.out.println(hello1 == hello2.toString());&lt;br /&gt;  &lt;br /&gt;  System.out.println(hello1 == hello2.toString().intern());&lt;br /&gt;  &lt;br /&gt;  System.out.println(new String(hello1) == hello2);&lt;br /&gt;  &lt;br /&gt;  System.out.println(hello1 == hello2.intern());&lt;br /&gt;  &lt;br /&gt;  System.out.println(new String(hello1) == hello2.intern());&lt;br /&gt;  &lt;br /&gt;  System.out.println(new String(hello1).intern() == hello2.intern());&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35730132-116038290787933138?l=java-source.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://java-source.blogspot.com/2006/10/java-string-metoda-intern.html</link><author>noreply@blogger.com (Ondřej Kvasnovský)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-35730132.post-116042928433888662</guid><pubDate>Wed, 29 Nov 2006 22:18:00 +0000</pubDate><atom:updated>2006-12-03T19:47:01.524+01:00</atom:updated><title>Hibernate - vytvoření a update databáze</title><description>To jestli chceme databázi při každém spuštění aplikace vytvářet nebo ponechat, lze nastavit v konfiguračním souboru &lt;span style="FONT-STYLE: italic"&gt;*.cfg.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Toto je vhodná volba pro testování při vytváření aplikace. Někdy však můžeme ocenit možnost vytvořit nebo aktualizovat databazi bez zásahu do konfiguračního souboru. K tomu použijeme třídy &lt;span style="FONT-STYLE: italic"&gt;org.hibernate.cfg.Configuration, org.hibernate.tool.hbm2ddl.SchemaUpdate &lt;/span&gt;a&lt;span style="FONT-STYLE: italic"&gt; org.hibernate.tool.hbm2ddl.SchemaExport&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Pro vytvoření databáze můžeme napsat následující kód:&lt;span style="FONT-STYLE: italic"&gt; &lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Configuration c = newConfiguration().configure&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="font-family:courier new;"&gt;("ormmapping/hibernate.cfg.xml");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SchemaExport se = new SchemaExport(c);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;se.execute(true, true, false, false);&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Pro update databáze napíšeme:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Configuration c = newConfiguration().configure &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;("ormmapping/hibernate.cfg.xml");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SchemaUpdate su = new SchemaUpdate(c);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;su.execute(true, true);&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35730132-116042928433888662?l=java-source.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://java-source.blogspot.com/2006/10/hibernate-vytvoen-update-databze.html</link><author>noreply@blogger.com (Ondřej Kvasnovský)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-35730132.post-116048286324191992</guid><pubDate>Tue, 10 Oct 2006 11:29:00 +0000</pubDate><atom:updated>2006-10-11T15:06:54.133+02:00</atom:updated><title>SVN</title><description>Jak správně nainstalovat a nakonfigurovat SVN?&lt;br /&gt;&lt;br /&gt;Stáhnete si z následující adresy (&lt;a href="http://subversion.tigris.org/"&gt;http://subversion.tigris.org/&lt;/a&gt;) potřebný spustitelný soubor a nainstalujete si SVN na své PC.&lt;br /&gt;Dále je pro instalaci je potřeba service soubor . Až si ho nakopirujete do složky&lt;span style="font-family:courier new;"&gt; /bin&lt;/span&gt;, spustíte ji přes příkazový řádek s následujícími parametry:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SVNService.exe -install -d -r c:\svn , tak &lt;/span&gt;můžete pokračovat v dál.&lt;br /&gt;&lt;br /&gt;Po instalaci SVN vytvoříme repository:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;svnadmin create --fs-type bdb c:\svn\muhehe&lt;/span&gt;&lt;br /&gt;- vytvoříme reposit &lt;span style="font-family:courier new;"&gt;\muhehe &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;&lt;/span&gt;Získání informací o konkrétním depositoru:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;svn info c:\SVN\muhehe &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;svn info file:///c:\SVN\muhehe &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;svn info svn://localhost/muhehe&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pak se pokusíme vypsat checked files:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;svn co &lt;span&gt;file:///SVN &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;Vytvoření adresáře v SVN:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;mkdir -m "Komentar..." svn://localhost/muhehe/novyadresar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:+0;"&gt;Jak smazat servis:&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;sc delete SVNService&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;&lt;/span&gt;&lt;br /&gt;Na konec jsem našel link na konfigurační spustitelný soubor. Jmenuje se &lt;span style="font-family:courier new;"&gt;svn1clicksetup&lt;/span&gt;. Stačí se po něm podívat na výše zmíněném odkazu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35730132-116048286324191992?l=java-source.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://java-source.blogspot.com/2006/10/svn.html</link><author>noreply@blogger.com (Ondřej Kvasnovský)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-35730132.post-116250885401529522</guid><pubDate>Mon, 02 Oct 2006 21:51:00 +0000</pubDate><atom:updated>2006-12-01T12:12:46.373+01:00</atom:updated><title>UML - just my kidding... no more.</title><description>&lt;span style="FONT-WEIGHT: bold"&gt;UML &lt;/span&gt;is unified modeling language, witch serves for modeling and desing of applications. I studied UML on university for one semester. I gues that UML can be learn in two months. I was working on some project where we used some practice from UML. For instance we used use case and class diagrams. I think that this both diagrams is general for application development. Another diagram can be use for closer application specification.&lt;br /&gt;Individuale aspects of UML is mainly "Requirements", "Analyse", "Design" and "Implementation".&lt;br /&gt;&lt;br /&gt;So now I describe individual aspects of UML:&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;A. Requirements:&lt;/span&gt;&lt;br /&gt;1. We must know wath we want do. And for this we must do requierement and specification analysis. Than if we have this analys we can continue with another aspects.&lt;br /&gt;2. Second, and wery useful aspect is "Use Diagram". Use diagram is using for modeling witch roles has actors in our applications and with activities he can do.&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;B. Analyse:&lt;/span&gt;&lt;br /&gt;3. In this part we want find classes and objects. These classes and objects we can find in use case diagrams and we can do some textual analyse, where we find names of classes. After when we have names of classes we can start with finding asociations betwen these classes. For making asociations we can use inheritance, polymorphism, agregations and composits. Then we can make activity diagrams. In activities diagrams we want describe proces like as "Object oriented diagram of flows". Thanks to them we can make model contains of activyties collection and state transitions.&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;C. Desing:&lt;/span&gt;&lt;br /&gt;In desing part we want make and specify classes from analyse part. Actualy in this part we implement use cases. Indivisible part of desing is "State diagrams". In state diagrams we want catch witch states objects we can have.&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;D. Implementation:&lt;/span&gt;&lt;br /&gt;In this part we want sort classes to the specify components. Implementation is about transalation model to code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35730132-116250885401529522?l=java-source.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://java-source.blogspot.com/2006/11/uml-describe.html</link><author>noreply@blogger.com (Ondřej Kvasnovský)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item></channel></rss>