Pokazywanie postów oznaczonych etykietą java. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą java. Pokaż wszystkie posty

poniedziałek, 17 stycznia 2011

Metoda equals, LSP i Twoje IDE

Jeżeli chodzi o metodę equals(Object obj) w Javie, to wiadomo jedno - wcale nie jest taka trywialna do napisania, zwłaszcza że jednocześnie trzeba pamiętać o hashCode(). Na szczęście nowoczesne IDE takie jak Eclipse czy NetBeans potrafią same wygenerować poprawną parę tych metod. Ale czy aby na pewno?

Przypomnijmy sobie czego Sun (ups, Oracle) wymaga jako "kontraktu" metody equals (http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#equals%28java.lang.Object%29):

1. Powinna to być relacja równoważności, czyli musi być:
a) zwrotna: x musi być równe x,
b) symetryczna: jeżeli x=y, to y=x,
c) przechodnia: jeżeli x=y i y=z, to x=z

2. Musi być spójna, tzn. ta sama para x i y musi zawsze dawać ten sam wynik.

3. I musi też zachodzić: x != null

Przesłaniając metodę equals trzeba pamiętać o wszystkich pięciu warunkach - na szczęście naszej pamięci przychodzą na pomoc nowoczesne IDE :)

wtorek, 28 września 2010

SimpleDateFormat i wielowątkowość

Nie wszyscy zdają sobie sprawę, że standardowa w Javie klasa SimpleDateFormat z pakietu java.text nie jest bezpieczna ze względu na wątki. W sumie mało kto zdaje sobie z tego sprawę.

Bardzo często można spotkać w projektach Javy EE podobne linijki kodu:

Date date = GlobalConst.DATE_FMT.parse(datestring);

To, że potrzebna jest nam kontrola wielowątkowości pokaże następujący prosty przykład:

poniedziałek, 20 września 2010

"Failed to load Main-Class ..." i NetBeans

Ostatnio pracując z malutkim projektem w NetBeans w pewnym momencie świeżo zbudowany plik JAR uraczył mnie komunikatem:

Failed to load Main-Class manifest attribute

Po krótkim guglaniu dowiedziałem się, że najczęściej taki komunikat dostają osoby, które do pisania programów wykorzystują tylko javac i cat i zapominają umieścić w pliku JAR plik manifest.mf. Proponowane rozwiązanie: użyj jakiegoś IDE, takiego jak Eclipse. Taaaa....

W JARze budowanym przez NetBeansa znajdował się wspomniany plik manifest.mf, ale nie mówił on która klasa w pliku jest główną. Przyczyną takiego błędu w tym IDE jest utworzenie projektu "class library", a nie "java application" - tak brzmi oficjalna wersja. Ale przecież 10 minut temu to jeszcze działało i było założone jako "java application".

Co ciekawe, pod samym NetBeansem cały projekt się uruchamiał, miał wybraną klasę główną itd., itp. Co poszło nie tak?

sobota, 4 września 2010

Java i http://

Kiedy usłyszałem pytanie z pewnej rozmowy kwalifikacyjnej stwierdziłem: "to jest totalnie jutro na moim blogu" :)

Pytanie jest proste: czy poniższy kod napisany w Javie się skompiluje?

public class HttpTest {
  public static void main(String[] args) {
    System.out.println("Hi!");
    http://www.java.com
    System.out.println("Hello!");
  }
}


Pogrubiona linijka to ta, której tak naprawdę dotyczy pytanie ;)

poniedziałek, 26 lipca 2010

Codility

Codility to ciekawy serwis dla osób z HR, który służy do automatycznego testowania umiejętności programistycznych kandydatów.

Serwis w założeniach przypomina automatyczne sprawdzarki stosowane na konkursach programistycznych. Firma powstała w Anglii, ale sadząc po imionach i nazwiskach założyli ją Polacy ;) Może w końcu na rozmowach kwalifikacyjnych częściej będzie się dostawać zadania programistyczne niż te typu "Wieśniak musi przewieźć przez rzekę wilka, kozę i kapustę..."

Aby zobaczyć jak działa Codility można:
a) mieć szczęście i trafić na dział HR który tego używa,
b) samemu wykupić subskrypcję,
c) kliknąć przycisk "Demo test".

Jeżeli kogoś przeraża "geeks only!", to niech się nie przejmuje ;) Rozwiążmy tutaj (w Javie) zadanie, które jest tam prezentowane.

wtorek, 16 marca 2010

Program w Javie bez main() i średników

Ostatnio padło wyzwanie - napisać program bez użycia funkcji main w Javie. Taki komentarz pojawił się przy okazji programu w C bez średników - http://wojtek-m.blogspot.com/2010/03/program-w-cc-bez-uzycia-srednikow.html ;)

Hm, stwierdziłem że podbije poziom trudności i w Javie też ani jeden średnik nie zagości! Co będzie trudniejsze niż w C, bo Java jest bardziej "uporządkowana".

Oryginalny program (do znanej już gry w "bum" - osoby nie w temacie niech zerkną do powyżej podanego posta):

public class BumGame {
  public static void main(String[] args) {
    for (int i = 1; i <= 100; i++) {
      if (i % 3 == 0 || i % 5 == 0) {
        System.out.println("BUM");
        continue;
      }
      int j;
      for (j = 1; j <= i; j *= 10) {
        int digit = (i / j) % 10;
        if (digit == 3 || digit == 5) {
          System.out.println("BUM");
          break;
        }
      }
      if (j > i) {
        System.out.println(i);
      }
    }
  }
}

niedziela, 20 grudnia 2009

NetBeans i Subversion

Ostatnio pracując pod NetBeansem 6.7.1 miałem spory problem, aby to IDE współgrało z moim repozytorium SVN.
Nie, nie spory problem. Spory problem aż tak nie denerwuje człowieka. A to było wkurzające.
Wszystko rozbijało się o następujący komunikat:

sobota, 12 grudnia 2009

Liczenie SLOC w linii komend Windows

Liczba linii plików źródłowych (Source Lines of Code, SLOC) to najprostsza miara wielkości projektu informatycznego. Ma ona wiele wad (zwłaszcza, że nie oddaje złożoności projektu), ale jest chyba najczęściej stosowana.

Niestety chyba żadne IDE nie ma wbudowanego narzędzia do policzenia linii kodu w projekcie. Oczywiście można pobrać odpowiednie wtyczki do metryk - np. Metrics dla Eclipse, która to potrafi o wiele więcej niż policzenie SLOC.

Ale nas interesuje proste rozwiązanie ;)

Można więc policzyć liczbę linii kodu w projekcie z użyciem standardowych poleceń z linii komend w Windows ;)

wtorek, 15 września 2009

Java, walidator XML Schema i świadomość przestrzeni nazw

Kiedy pracowaliśmy zespołem nad Teleradiologią i chciałem napisać testy JUnit do swojego modułu kręcącego się wokół XML-i napotkałem ciekawy problem. Parser korzystający z XML Schema działał świetnie, natomiast przy uruchamianiu testów jednostkowych odpowiednich metod pojawiał się wyjątek SAX:

"cvc-elt.1: Cannot find the declaration of element nazwa elementu głównego".