- Brak typów wartościowych w klasach generycznych (osobiście zawsze mnie to denerwowało, gdy chciałem mieć kolekcję np. typu
int
, to byłem zmuszany do Integer
w której mogły się pojawić null
, których nie chciałem, czyli praktycznie zawsze musiałem sprawdzać co wrzucam do kolekcji)
Scala już na to pozwala ;)
Scala może tak, ale Java nie, mówimy o Javie.
- (Nie jestem w stanie przytoczyć przykładu, ale kilka razy szły wiązanki na Javę przez to) niby multiplatformowa, a zdarzały mi się przypadki kiedy pod Linux coś nie działało, a pod Windows tak i odwrotnie. Więc gdzie słynne "Piszesz raz, uruchamiasz gdzie chcesz"?
Jak ktoś korzysta z mechanizmów specyficznych dla danego OSa to tak potem jest. To wina programisty a nie Javy.
Czyli nie jest w 100% przenoszalna. Czyli język jak każdy inny. Więc po co się chwalą multiplatformowością? Szkoda że nie pamiętam co u mnie nie działało, ale jestem prawie na 100% pewien, że chodziło o zdarzenia, że coś nie tak działało z nimi pod Javą (w sensie samo rzucanie lub odbieranie ich).
- Brak wyrażeń lambda, które bardzo ułatwiają programowanie i skracają kod. Tutaj nie da się tego opisać, jeśli ktoś nie korzystał.
Jest Guava która pozwala na stosowanie map-filter-reduce no i w javie 1.8 lambdy mają już być. Poza tym nie przesadzałbym z użytecznością lambdy, bo w realnych sytuacjach przyda się to bardzo rzadko ;]
Przydaje się bardzo rzadko? Jak wspomnieli moi przedmówcy, 80% metod to wykorzystuje, a proste operacje, które na piechotę trzeba rozwiązywać pętlą for
w której w if-ach sprawdza się coś i ewentualnie wyniki pakuje do kolekcji, dzięki lambda załatwia się w jednej prostej, krótkiej, o wiele bardziej zrozumiałej linijce, to to ma być nieprzydane? Połowa mojego kodu zazwyczaj się o lambda opiera, bo to jest bardzo wygodny mechanizm.
- Zamiana kolekcji na tablice, czyli
ToArray()
, po prostu masakra w porównaniu do C#.
Masakrą to jest w ogóle pomysł zamieniania kolekcji na tablice :P Jedyne uzasadnienie jakie widzę to konieczność przekazania tablicy do jakiejś starej metody, napisanej 700 lat temu, która wymaga tablicy jako argumentu.
A to dziwne, bo nowe metody w różnych klasach, też czasem chcą tablic. Może Ty żyjesz w innych czasach? Poza tym, czasami chce się przekazać część lub całą kolekcję. I dziwne, że tutaj C# bardzo często opakowane w jakiejś klasie kolekcje, zwraca je przy pomocy tablic...hmmm...może dlatego żeby dać minimalną szansę na zmodyfikowanie tego co jest kolekcji?
- (Coś, co często wykorzystuje) metody rozszerzające: dopisałem sobie kilka funkcji do klas, które są standardowo w C#. Teraz dołączam tylko własną bibliotekę do projektu i już mogę się cieszyć własnymi dodatkami do standardowych klas. Bez przeciążania, bez pamiętania nowych nazw. Po prostu, reszta sama się dzieje.
o_O To akurat wygląda mi na bardzo dziwne podejście, szczególnie że potem nie wiesz co faktycznie w tych klasach jest, a co sam dodałeś.
Dlaczego miałbym nie wiedzieć? Czy Ty korzystałeś kiedyś z C#? Zresztą nawet jakbym zapomniał, to co się stanie?
Wolę zapomnieć i mieć zawsze pod ręką metody które co chwila wykorzystuję niż pisać długi kod co chwila, który jest tym samym wszędzie (chyba do tego właśnie służą metody, żeby nie powtarzać kodu).
- Rzutowanie tablic (w Javie też do obejścia, ale ile razy można ręcznie rzutować każdy element tablicy? C# robi to za nas).
Nie rozumiem tego punktu. Przecież można w javie zrobić toArray z konkretnym typem...
No ale jak już masz tablicę jednego typu, to nie zrzutujesz jej na inny typ w prosty i oczywisty sposób. Kod typu
Object[] elem = {1, 3, 5, 6};
Integer[] i = (Integer[]) elem;
Opluje Cię wyjątkiem, a w C# działa bez problemu. A niektóre metody w Javie zwracały tablicę Object
, szczególnie kiedy korzysta się z refleksji. Czasami wiem co tam siedzi i chciałbym szybko zrzutować. Ale w Javie się nie da. Również to nie zadziała:
Object[] elem = {1, 3, 5, 6};
Integer[] i = elem.toArray(/*coś tutaj ewentualnie*/);
Bo tablica w Javie nie ma metody toArray. Więc zostaje albo ręczne rzutowanie przez for i samemu każdy element przepisujemy, albo
Object[] elem = {1, 3, 5, 6};
Integer[] i = Arrays.copyOf(elem, elem.length, Integer[].class);
ale nie każdy o tym musi wiedzieć, albo można zapomnieć o tym sposobie, jeśli dla tablic jest to wyjątkowo inaczej wykorzystywane niż dla innych typów.
-
var
, niby mała rzecz, a cieszy. Nie zastanawiam się co metoda zwraca, C# się za mnie martwi. W Javie...no niestety.
Nie bardzo rozumiem w czym problem. Chyba tylko jak kodujesz za pomocą lodówki. Normalne IDE bez problemu uzupełnia ci typ.
To nie jest kwestia IDE, zresztą @ŁF chyba wyjaśnił wystarczająco jak to działa. Ty chyba naprawdę nigdy nie używałeś C# w dużym projekcie, skoro piszesz takie rzeczy.