čtvrtek 15. ledna 2009

Private constructor

I started read the Bloch's Effective Java, 2nd edition. I read the 1st edition couple years ago. I must say, that second edition is not only a facelift - there are much more items explained. E.g. generics, concurrent api, etc.

Item 4 (Item 5 in the 1st ed.) is about Protecting utility class with private constructor. When you have some class with only static methods (e.g. Math), it is useful to protect instantiation of this class. Standard way, how to implement it, is by private default constructor.

public class MuUtilClass {
private MyUtilClass(){}
// other methods omitted
}

Joshua find out, that you can change the accesibility of the constructor by reflection (AccessibleObject.setAccesible). Hence it is better to throw exception inside the constructor.

public class MuUtilClass {
private MyUtilsClass() {
throw new AssertionError();
}
// other methods omitted
}

čtvrtek 8. ledna 2009

Launchy

Pozor, následující prográmek je vysoce návykový.


Jde o spouščeč programů launchy. Prohledá vám hardisk a pak už to frčí. Po stisku ALT-Space otevře miniaturní textfield do kterého můžete začíst psát. Třeba 'word' a spustí vám Office Word.

Mě pomáhá zejména s vyhledáváním knížek, které okupují značnou část mého disku. Napíšu třeba 'spring' a hned mi ukáže všechny knížky o springu.

Myš už můžu vyhodit z okna ;-).

pondělí 8. prosince 2008

Haruki Murakami: Konec světa & Hard-boiled Wonderland


Hned jak se v metru objevily reklamy na novou knížku mého oblíbeného autora (zatím jsem přečetl vše, co vyšlo v češtině), neváhal jsem a knížku koupil.

Nemá asi smysl pitvat, že se mi jeho styl prostě líbí, a snadno se mi identifikuje s hlavním hrdinou. Děj je opět kafkovsky absurdní, ale o tom se jistě dočtete více od serióznějších kritiků.

Já bych chtěl poukázat na originální hlášky.

  • Přesto se zdá, že jsou všichni navzájem spojeni sice neviditelným, ale přesto nepopiratelným poutem důvěrné vzpomínky. [s.23]

  • Sexuální touha, to je pozitivní energie.Pokud ji není jak vybít, hromadí se a hromadí a člověk přestává jasně myslet a narušená je i jeho fyziologická rovnováha. U mužů stejně jako u žen. U žen to navíc vede k nepravidelnostem v menstruaci a nepravidelný cyklus vede zas k psychické labilitě. [s.57]

  • Já připadá, že ve vás něco je. Anebo že vám naopak něco chybí. To vyjde docela nastejno. [s.60]

  • Pravil jsem rovnou, že tomu moc nerozumím. Jsem totiž člověk povětšinou upřímný. Když je mi něco jasné, řeknu upřímně, že je mi to jasné, když mi to jasné není, přiznám bez mučení, že to nechápu. Nejasné odpovědi nedávám. Myslím si totiž, že je naprostá většina problémů zaviněná tím, že se někde někdo nejasně vyjádří. A věřím tomu, že na světě mluví tolik lidí vyhýbavě a nejasně proto, že si někde v hloubi duše koledují o problém. [s.61]

  • Smrti samotné se tolik nebojím. Jak napsal William Shakespeare: kdo letos umře, má pokoj pro příští rok. [s.62]

  • Její příšerný apetýt připomínal střelbu z těžkého kulometu do kůlny na dříví. [s.107]

  • "Kdy jsi vlastně naposledy měl nějakou ženskou?" zeptala se mě nakonec. Odklopil jsem v duchu víko své paměťové bedny a chvíli se přehraboval v obsahu. [s.108]
  • How to calculate age?

    I offten have on my projects a lot of conditions, which depends on the age of the client, user, his wife or dog ;-).

    Standard Java API is not very friendly for this use case. If you can't use JodaTime as me, I hope you appreciate this little calculator.



    public class AgeCalculator {

    public static int getAge(final Date dayOfBirth) {
    return getAge(dayOfBirth, new Date());
    }

    public static int getAge(final Date dayOfBirth, final Date referenceDay) {
    if (dayOfBirth == null) {
    throw new IllegalArgumentException("Parameter 'dayOfBirth' can't be null.");
    }
    if (referenceDay == null) {
    throw new IllegalArgumentException("Parameter 'referenceDay' can't be null.");
    }

    final Calendar calRef = Calendar.getInstance();
    calRef.setTime(referenceDay);

    final Calendar cal = Calendar.getInstance();
    cal.setTime(dayOfBirth);

    final int yearRef = calRef.get(Calendar.YEAR);

    final int year = cal.get(Calendar.YEAR);

    int result = yearRef - year;

    cal.set(Calendar.YEAR, yearRef);
    if (calRef.before(cal)) {
    result--;
    }

    return result;
    }

    }

    pátek 5. prosince 2008

    Už nikdy více NPE

    Na posledním projektu jsem ze zabýval archeologickou činností - upravovat aplikaci, která vznikla asi před dvěma lety a od té doby se příliš neměnila. Šlo o poměrně jednoduchou webovou aplikaci, která ukládá data z pár formulářů do databáze. Prostě brnkačka.

    Horší to bylo s implementací. Kód byl úplně zamořen následující konstrukcí

    if (someString!=null && someString.trim().length()>0) {
    // do something
    }

    nebo ještě v komplikovaněji

    if (firstName!=null && firstName.trim().length()>0 && lastName!=null && lastName.trim().length()>0) {
    // do something different
    }

    Kdyby to byl výskyt jen tu a tam, tak nad ním mávnu rukou, ale podobné podmínky tvořili asi 80% celého kódu.

    Většinou si programátoři začnou psát svoji vlastní MyUtil třídu, kde soustředí různé malé metody. Co programátor, to další MyUtil třída.

    Neznalost neomlouvá, takže - pro tyto účely je už dávno vytvořená, zdokumentovaná a asi milionkrát otestovaná třída StringUtils, která je součástí apache commons lang balíčku (doporučuji prostudovat vše, co v této knihovničce je - pozor je vysoce návyková).

    Výsledek vypadá následovně - čitelnost o poznání lepší.

    if (StringUtils.isNotBlank(firstName) && StringUtils.isNotBlank(lastName)) {
    // do someting
    }

    Pokud tedy máte pocit, že si chcete napsat svoji vlastní MyUtil třídu vězte, že objevujete znova kolo.

    neděle 26. října 2008

    Nepovedený zimmerit - díl třetí

    Po mnoha večerech, kdy jsem si hrál s novým tmelem jsem nakonec vyměkl koupil plechy od eduarda. Nejhorší bylo ten starý tmel dostat dolů. Myslím ale, že výsledek je tak o 100% lepší, než s použitím tmelu.

    pátek 17. října 2008

    Testing blocking operation

    Sometimes I have a luck and I can write multi-threaded application. I like testing all my classes with JUnit but it has no support for concurrency.

    During studding an excellent book Java Concurrency in Practice which explains all new features added in JSE5 regarding to concurrency, I was looking forward to chapter about testing with JUnit.

    The author recommends - if you need to test, that your operation blocks the calling thread, it is similar pattern as testing that your operation throws Exception.


    void testTakeBlocksWhenEmpty() {
    final BoundedBuffer bb = new BoundedBuffer(10);
    Thread taker = new Thread() {
    public void run() {
    try {
    int unused = bb.take();
    fail(); // if we get here, it's an error
    } catch (InterruptedException success) { }
    }};
    try {
    taker.start();
    Thread.sleep(LOCKUP_DETECT_TIMEOUT);
    taker.interrupt();
    taker.join(LOCKUP_DETECT_TIMEOUT);
    assertFalse(taker.isAlive());
    } catch (Exception unexpected) {
    fail();
    }
    }


    While I was watching funny video about java puzzles I was surprised, that the example from the book does not work !!!

    JUnit framework all exceptions and errors which are thrown from user thread does not interprets as failure! Fortunately, it logs stack trace to the console at least.

    Try this simple example - what colour does your test - green or red ?

    public void testFail() throws InterruptedException {
    final Thread t = new Thread(new Runnable() {
    public void run() {
    assertEquals(2, 5);
    }
    });
    t.start();
    t.join();
    }


    My is green and I expect, it should be red, because in my world, two does not equal to five.

    How to fix it? You need to catch the exception or error in your user thread and forward it to JUnit normal thread. For example in this way.


    private volatile Exception eException = null;
    private volatile Error eError = null;

    public void testEquals() throws InterruptedException {
    final Thread t = new Thread(new Runnable() {
    public void run() {
    try {
    assertEquals(3, 5);
    } catch (Exception e) {
    eException = e;
    } catch (Error e) {
    eError = e;
    }
    }
    });
    t.start();
    t.join();
    }

    protected void tearDown() throws Exception {
    if (eException != null) throw eException;
    if (eError !=null) throw eError;
    }

    protected void setUp() throws Exception {
    eException = null;
    eError = null;
    }