Zaloguj się
Projekty Kategorie Archiwum

Zazwyczaj, żeby uchronić wewnętrzne pola danej klasy przed przypadkowymi zmianami, stosuje się gettery/settery. Getter/setter (nowe polskie słowa ;-) to para publicznych metod pobierających i ustawiających prywatne pola klasy. Oto klasyczny przykład klasy z getterem getValue i setterem setValue.

public class Foo {
  private int value = 666;
  public void setValue(int newValue) { value = newValue; }
  public int getValue() { return value; }
}
...
Foo foo = new Foo();
foo.setValue(100);
System.out.println("Foo value: " + foo.getValue());
...

Powyższe rozwiązanie ma jedną podstawową wadę - trzeba pisać dużo prawie identycznego kodu. Ponieważ jestem osobą leniwą, więc napisałem sobie klasę Property. Nie jest to może odkrycie Ameryki, ale przynajmniej rozwiązuje część problemów natury lenistwa. Poniżej znajduje się zmodyfikowana wersja poprzedniego kodu. Tym razem z wykorzystaniem klasy Property. Od razu widać, że zaoszczędziłem w ten sposób całe dwie linijki kodu. Hurra! Pole value jest zadeklarowane jako public final więc jest dostępne dla innych klas, i zarazem nie możemy zmieniać jego wartości.

public class Foo {
  public final Property<Integer> value = new Property<Integer>(666);
}
...
Foo foo = new Foo();
foo.value.set(100); // ok
// foo.value = null; // błąd kompilacji, ponieważ foo.value jest final
System.out.println("Foo value is " + foo.value);
...

Przykład uproszczonej implementacji klasy Property oraz BooleanProperty:

public class Property<T> {
	protected T value;
	public Property() { this(null); }
	public Property(T value) { this.value = value; }
	public T get() { return value; }
	public void set(T value) { this.value = value; }
	public boolean isNull() { return value == null; }
	@Override
	public String toString() { return (value == null) ? null : value.toString(); }
}

public class BooleanProperty extends Property<Boolean> {
	public BooleanProperty() { this(false); }
	public BooleanProperty(boolean value) { super(value); }
	public void no() { value = false; }
	public void set(String value) { super.set(Boolean.parseBoolean(value)); }
	public void toggle() { value = !value; }
	public void yes() { value = true; }
}

Zauważ, że mając pole typu BooleanProperty, możesz napisać if (foo.value.get()) { ...

Takie rozwiązanie ma również niewielki minusy. Oprócz zmiennej typu Property<T>, w pamięci przechowywane jest również wewnętrzne pole value typu T, więc w niektórych przypadkach zużycie pamięci może wzrosnąć (jednak z drugiej strony oszczędzamy pamięć na metodach get/set, które są wspólne dla wszystkich pól typu Property<T>). W niektórych przypadkach może nastąpić niewielka utrata przejrzystości kodu (np. addressBook.get().person.get().name.get()) i powstaje kandydat do The Daily WTF ;-)

Kategoria Java | Ogólne
26 sierpnia
W czasie gdy będę się lenił na dalekiej północy, zapraszam chętne osoby do testowania moich programów :-)

Makagiga 0.9.3 pre-beta (Web Start)
KShutDown 0.7.1 pre-beta (Src i Rpm dla FC4)
26 sierpnia
Nie chce mi się pisać o czym jest ten film :P
Dodam tylko, że bardzo ciekawie wyglądają sceny filmowane "z perspektywy pierwszej osoby" (kto grał ten wie o co chodzi).

Nowy trailer
Kategoria Ogólne
25 sierpnia
Ustawiłem sobie nowy alarm, żeby nie przegapić Apokalipsy.

Image Hosted by ImageShack.us
24 sierpnia
Cholera, właśnie dostałem niemiecką wersję nigeryjskiego spamu. Arghh!

PS. Może mi się wydaje, ale chyba w niedziele spam nie przychodzi :/
Kategoria Ogólne
23 sierpnia
...są oczywiście na kanale BBC Prime :)

Black Adder III (Czarna Żmija) - w poniedziałki o 23:00 (powtórka w piątek o 21:00)

One Foot in the Grave (Jedną nogą w grobie) - w czwartki o 20:00
"Award-winning quirky black comedy starring Richard Wilson as Victor Meldrew, a grumpy senior citizen who always seems to provoke people into taking extreme action against him."
Kategoria Humor | Ogólne | TV
21 sierpnia
Na sokach są informacje typu "Przed użyciem wstrząsnąć". Moim zdaniem powinien też być wielki napis "Przed wstrząśnięciem zakręcić butelkę".
Kategoria Ogólne
20 sierpnia
Właśnie przypadkowo odkryłem, że uniksowe polecenie who am i ma również inne wariacje:
who are you (brak dokumentacji w man) i who mom likes :-)
Kategoria Linux | Ogólne
20 sierpnia
Na stronie Carrefour można przeczytać, że "Towary ułożone są w sposób zgodny z logiką zakupów.". Skoro tak, to dlaczego najczęściej kupowane artukuły są zawsze na samym końcu sklepu? Żeby kupić zwykły chleb, trzeba przejść pieszo z kilometr, mijając działy z obuwiem, bielizną, wyposażeniem domu... Najwyraźniej robię zakupy w sposób nieprawidłowy ;-)
20 sierpnia

Trole wydały nową wersję IMHO najlepszego (czyt. lepszego niż GTK) toolkitu.

Powstała strona przedstawiająca nowe technologie, które zostaną zaimplementowane w KDE 4. Samo KDE 4.0 zostanie wydane when it's done.
Nowe bajery KDE 4 to:
* Tenor - System wyszukiwania podobny do Beagle
* Oxygen - Nowy zestaw ikon
* Plasma - Połączenie pulpitu, panela i SuperKaramby w jeden megawypas ;-)
* Coolness - Taaaaak! Teraz twoja karta graficzna będzie miała co robić...

Kategoria Ogólne
19 sierpnia
Czy to naprawdę ostatnie godziny mojego ulubionego radia?

Czego ja teraz będę słuchał? :(
17 sierpnia
Zainspirowany Blinkenlights, zrobiłem dwie tapety (bardzo eye-candy), które skutecznie pomogą w odstraszaniu natrętnych użytkowników. Najlepiej skonfigurować jako pokaz slajdów w wygaszaczu ekranu.

Free Image Hosting at www.ImageShack.us Free Image Hosting at www.ImageShack.us
Edit: Dodałem wersję stylizowaną:
Free Image Hosting at www.ImageShack.us
Kategoria Humor | Ogólne
Free Image Hosting at www.ImageShack.us

Rok 2005: 640M of memory should be enough for anybody ;-)
Kategoria Gry | Ogólne
15 sierpnia
Tak to jest, gdy się zrobi zbyt elastyczną aplikację ;-)

Free Image Hosting at www.ImageShack.us
13 sierpnia

Ktoś dzisiaj przypadkowo porysował lakier 6-8 samochodów zaparkowanych na ulicy, gdzie mieszkam.

Mój tata powiedział do swej córki (czyli mojej siostry):
- Mam dwie wiadomości: dobrą i złą. Zła wiadomość jest taka, że ktoś porysował mi samochód.
- A ta dobra? - zapytała siostra.
- Tobie też porysowali samochód.

Wcześniej oczywiście padły trochę bardziej parlamentarne słowa.

Żeby było śmieszniej, szwagier specjalnie poszedł zaparkować samochód przed domem (tak dla bezpieczeństwa). AFAIK policja złapała sprawcę, a nawet przekazała każdemu kierowcy radosną nowinę o uszkodzeniu pojazdu drogą telefoniczną jak i osobistą :-)

Kategoria Ogólne
12 sierpnia
Zamiast zrobić tak:
boolean java.awt.event.MouseEvent.isLeftButton()
"Słoneczni" programiści zrobili tak:
boolean javax.swing.SwingUtilities.isLeftMouseButton(java.awt.event.MouseEvent anEvent)
Kategoria Java | Ogólne
10 sierpnia
Kategoria Humor | Ogólne | TV
9 sierpnia
KRRiTV udowodniła, że Heyah nie potrafi opowiadać bajek.
9 sierpnia
System statystyk Stat4U (zainstalowany na tej stronie) wyświetla frazy jakich szukali użytkownicy, zanim przypadkowo trafili na mojego bloga. Oto przykładowe zapytania z wyszukiwarek:
  • AL KHAIDA LINK - jestem na drugim miejscu w Google :P
  • JAK POWSTAŁ WSZECHŚWIAT? - na moim blogu na pewno jest odpowiedź na to pytanie
  • muza do ściągnięcia - LOL!
  • Mustang z dzikiej doliny download - komuś chodziło o film, a ja pisałem tylko o Javie "Mustang"
  • warez wyszukiwanie google site:jogger.pl - what?
  • "about:mozilla" - WTF?
  • +"alkomat"+kalkulator - :-)
Poza tym ludzie szukali pirackich filmów do ściągnięcia i informacji o Javie...
Kategoria Ogólne
DateFormatter.class.cast(DefaultEditor.class.cast(getEditor()).getTextField().getFormatter()).setFormat(DateFormat.getDateTimeInstance(dateStyle, timeStyle));
A może zna ktoś jakiś inny sposób na ustawienie formatu daty w JSpinner+DateEditor+SpinnerDateModel przy użyciu DateFormat.MEDIUM/SHORT?
Kategoria Java | Ogólne
Na szczęście jeszcze nie, ale już wkrótce... :(
Kategoria Ogólne
6 sierpnia
Kolejka przed skrzynką na listy :D

Free Image Hosting at www.ImageShack.us
6 sierpnia
Bykom Stop!
5 sierpnia

Dzisiaj, niespełna jednoletnia siostrzenica przed przypadek poznała swoje pierwsze linuksowe polecenie: /sbin/shutdown -h now (zainicjowane wciśnięciem przycisku power na ubudowie komputera).

Wyłączenie usługi acpid powinno pomóc na przyszłość :)

Kategoria Ogólne

Zbliżają się wybory prezydenckie i pewnie wielu z was nie wie na kogo zagłosować. Ponieważ wybór jak zawsze jest bardzo duży, postanowiłem napisać prosty poradnik, który pomoże wybrać ci najlepszego* prezydenta dla naszego sponiewieranego przez historię kraju.

Podczas wybierania prezydenta najlepiej kierować się tym, czy dany kandydat spełnia ogólnie przyjęte standardy. Jednym z mierników standardów jest test acid2. Test ten został pierwotnie stworzony z myślą o przeglądarkach internetowych, a dopiero później przystosowany do testowania standardów politycznych.

*) Mniejsze zło

Wyniki testu dla Andrzeja Leppera: Jak widać osoba testowana znacznie odbiega od normy.
Free Image Hosting at www.ImageShack.us

Teoretycznie kandydat powinien wyglądać tak:
Free Image Hosting at www.ImageShack.us

Z powyższego testu jednoznacznie wynika, że Andrzej Lepper nie jest najlepszym kandydatem na urząd prezydenta.

5 sierpnia

Makagiga Kolejna niezwykła wersja beta tego wspaniałego programu. Osobą odpowiedzialną za ten cud techniki, jest nieprzeciętnie przystojny i inteligentny autor tego bloga :P*

*) To nie jest oficjalny komunikat prasowy
4 sierpnia
What kind of stupid quiz are you? ;)
3 sierpnia
Free Image Hosting at www.ImageShack.us
2 sierpnia
I zostań "anarchistą o międzynarodowych powiązaniach"!
Kategoria Ogólne
2 sierpnia

Wyobraźmy sobie, że mamy jakąś osobę, której chcemy wręczyć łapówkę. Niestety nasza klasa definiująca osobę nie posiada funkcji służącej do wręczania łapówek:

public class Osoba { }

Rozbudujmy więc naszą klasę (polskie znaki zostały użyte w celu podniesienia przejrzystości kodu):

public class Osoba {
  void dajWŁapę(int kwota) { }
}

Okej... Chwilkę, przecież nie wszystkie osoby muszą być od razu skorumpowne...

Tada! Tak już lepiej. No nie zupełnie... Rokita mógłby się obrazić.

public class Polityk extends Osoba {
  void dajWŁapę(int kwota) { }
}

Teraz chyba wszystko jest już w porządku:

public class SkorumpowanyPolityk extends Polityk {
  void dajWŁapę(int kwota) { }
}

Taaa... A co z urzędnikami, lekarzami, etc? Wszyscy biorą w ten sam sposób. Trzeba zdefiniować wspólną metodę (interfejs). Oto nasz "sposób" na wręczanie łapówek dla wszystkich skorumpowanych osób:

public interface Skorumpowana {
  void dajWŁapę(int kwota);
}

1. Teraz możemy wziąć dowolną osobę:
Osoba jakaśOsoba = weźJakąśOsobę();

2. Sprawdzić, czy jest skorumpowana:
if (jakaśOsoba instanceof Skorumpowana)

3. I w końcu wręczyć łapówkę:
Skorumpowana.class.cast(jakaśOsoba).dajWŁapę(1000); // Java 5.0 i nowsza
((Skorumpowana)jakaśOsoba).dajWŁapę(1000); // Java starsza niż 5.0

4. A nasza nowa klasa opisująca skorumpowanego polityka, wygląda tak:

public class SkorumpowanyPolityk extends Polityk implements Skorumpowany {
  void dajWŁapę(int kwota) { }
}

A to przykładowy algorytm zamykający wszystkie skorumpowane osoby w Polsce ;-)

for (Osoba osoba : wszyscyMieszkańcyPolski) {
  if ((osoba instanceof Skorumpowany) && !(osoba instanceof Immunitet))
    doPaki(osoba);
}

Kategoria Java | Ogólne
< Wcześniejsze wpisy
Nowsze wpisy >

Kategorie

Ewolucja Internetu 8 | Fail 28 | Gry 45 | Humor 124 | Idiotyzm 48 | Java 107 | KDE 83 | KShutDown 22 | Linux 81 | Makagiga 58 Ogólne 792 | Polityka 74 | Programowanie 45 | Reklamy 2 | Techblog 17 | Teorie Spiskowe 11 | TV 55 | UI 2 | Użyteczność 27 | WWW 79 | Wyrwane z Kontekstu 24 | X Files 14

Archiwum

Luty 2012 | Styczeń 2012 | Grudzień 2011 | Listopad 2011 | Październik 2011 | Wrzesień 2011 | Sierpień 2011 | Lipiec 2011 | Czerwiec 2011 | Maj 2011 | Kwiecień 2011 | Styczeń 2011 | Listopad 2010 | Październik 2010 | Wrzesień 2010 | Sierpień 2010 | Lipiec 2010 | Czerwiec 2010 | Kwiecień 2010 | Marzec 2010 | Luty 2010 | Styczeń 2010 | Grudzień 2009 | Listopad 2009 | Październik 2009 | Wrzesień 2009 | Sierpień 2009 | Lipiec 2009 | Czerwiec 2009 | Maj 2009 | Kwiecień 2009 | Marzec 2009 | Styczeń 2009 | Grudzień 2008 | Listopad 2008 | Październik 2008 | Wrzesień 2008 | Sierpień 2008 | Lipiec 2008 | Czerwiec 2008 | Maj 2008 | Kwiecień 2008 | Marzec 2008 | Luty 2008 | Styczeń 2008 | Grudzień 2007 | Listopad 2007 | Październik 2007 | Wrzesień 2007 | Sierpień 2007 | Lipiec 2007 | Czerwiec 2007 | Maj 2007 | Kwiecień 2007 | Marzec 2007 | Luty 2007 | Styczeń 2007 | Grudzień 2006 | Listopad 2006 | Październik 2006 | Wrzesień 2006 | Sierpień 2006 | Lipiec 2006 | Czerwiec 2006 | Maj 2006 | Kwiecień 2006 | Marzec 2006 | Luty 2006 | Styczeń 2006 | Grudzień 2005 | Listopad 2005 | Październik 2005 | Wrzesień 2005 | Sierpień 2005 | Lipiec 2005 | Czerwiec 2005 | Maj 2005 | Kwiecień 2005 | Marzec 2005 | Luty 2005 | Styczeń 2005