Poproszę o linki do przykładów pokazujących jak beznadziejnym językiem jest Java

1

Wiele się słyszy wśród koneserów jaką męczarnią jest pisanie czegokolwiek w Java. Jednak nie mogę znaleźć na tym forum nic konkretnego oprócz ogólnych stwierdzeń "ugly" "verbose". Może ktoś poratować linkiem do konkretnego wątku/bloga z konkretnymi elementami Java, które wam tak spędzają sen z powiek. Bo może żyję w bańce myśląc, że złapałem Boga za nogi pracując w Java a naprawdę to męczę się jak jakiś górnik z kilofem w kopalni?

5

Jeśli czujesz satysfakcję z kodowania, to po co sobie ją psuć? Jak sobie celowo nie popsujesz to jeszcze jakiś czas będzie fajnie :)

1

@Bonanzaa: bo pewnie masz projekty w Javie 8+. Jakbyś miał w Javie 7 czy 6 to byś też twierdził że jest bardzo verbose :)

0

Jednak nie mogę znaleźć na tym forum nic konkretnego oprócz ogólnych stwierdzeń "ugly" "verbose".

Jako programista Javy spojrz np. na takiego C++. No pewnie stwierdzisz, ze "ugly". Czemu? No za caloksztalt.
To nie jest tak, ze jedna czy dwie rzeczy to problem tylko caly jezyk jest jakis taki meh. A zeby sie o tym przekonac to trzeba sie pobawic innym jezykiem.
O ile sie osobiscie nie pobawisz (tylko np. przeczytasz kilka przykladow) to mozesz miec nawet odwrotne przemyslenia spowodowane zwyklym przyzwyczajeniem i nieznajomoscia skladni.

2

Odróżnijmy kilka rzeczy
"beznadziejność" jako "bez nadziei na szybkie duże zmiany". Java ma 25 lat, powstała w oparciu o krytycyzm C++ i inspirację (raczej uniwersyteckich niż przemysłowych) języków obiektowych swojej epoki. Jednym z celów było wbudowanie w urządzenia, co się nie stało, aż 10 lat później jako J2ME.
Wessał ją rynek korporacyjny, stąd m.in. BARDZO wysokie wymogi wstecznej kompatybilności
Od ok 2-3 lat rozwój jest "demokratyczny" i fajne (czy strategiczne ???) ficzery wychodzą szybciej.

Co "utraciła" Java widać np w C#, to w gruncie rzeczy "Java 2.0" - ale każdy projekt "2.0" nie muszący zachować kompatybilności ma wielkie szanse, i one zostały DOBRZE wykorzystane (zdanie człowieka raczej z "przemysłu" niż uniwersytetów)
Inna krytyka Javy popłynie od kolegów aktywnych w językach (bardziej) funkcyjnych

Java jest językiem pełnym, tzn do wszystkich zadań, PROSTYM (ilość konstrukcji syntaktycznych Java a C# to przepaść 1) ).
I jeśli by "beznadziejne" interpretować jako "uniwersalne słowo negatywne wysokiej wagi" to zupoelnie niezasłużenie. Owszem, jest verbose, i niemal tyle

  1. jak język dał "za mało" w swoim rdzeniu syntaktycznym, to wyłazi to jak słoma z butów. Np rdzeń języka Java nie zawiera konceptu "właściwości" czyli "property", i wylazło to jako konwencja "beanów". Sporo przypadków, ze biblioteka standardowa czy biblioteki niezależne (Vavr mi się kojarzy) nadrabiają coś, co by mogło być zaszyte. Ale rozmowa o bibliotekach to już nieco inna niż o języku.
2

Java sprawdziła się jako narzędzie do pracy zespołowej. Można szybko przejąć, zrozumieć, zmodyfikować stary kod. Popracuj w utrzymaniu, zrozumiesz. "Pokodzić" każdy lubi, ja też. Nie w tym rzecz.

2

Troche tak ... who cares ? "Ale ty masz młotek brzydki, taki z czerwoną rączką, mój z niebieską jest ok". O ile to ten sam typ młotka to co za roznica

3

Wiele się słyszy wśród koneserów - koneserów czego? Chyba mielonki turystycznej.

  • W danym języku programowania się umie pisać albo się nie umie.
  • Dany język programowania jest do pewnych zastosowań lepszy, gorszy albo porównywalny z innymi.

Ci koneserzy to najprawdopodobniej Ci, którzy używają języka którego nie umieją i stosują go do rzeczy do których lepiej było zastosować inny.
Przykładem może być pisanie w Pythonie na AVR z 256 bajtów RAM i 1 kB miejsca na kod programu nie umiejąc dobrze Pythona. Teoretycznie się da ale faktycznie po takich przejściach można z dużym prawdopodobieństwem zniechęcić się do Pythona.

0

Czyli wynika z tego, że to tak jak z lepszością XBoxa nad Playstation, a inne języki są elitarne więc modne jest krytykowanie Java. Tak myślałem

1

Ale probowales sam innych jezykow?

0

Pracowałem z Kotlinem kilka miesięcy. Ale moje wnioski oparłem na opiniach użytkowników tego szanownego forum, którzy posiadają na tyle dużą wiedzę, żeby się w tym temacie wypowiedzieć.

0

Swoją drogą to ciekawe. Sam się zastanawiałem, co takiego jest w tych wszystkich innych językach, że Java wypada przy nich tak blado, a jak przychodzi to wypisania kilku przykładów by pokazać wyższość języka X nad Javą to nie ma chętnych.

Nie zrozumcie mnie źle, nie chcę za wszelką cene udowodnić że Java jest świetna i nic jej nie brakuje, tylko tak jak OP, po prostu interesują mnie konkretne przykłady gdzie Java wypada tak źle na tle czegoś innego.

1

@Bonanzaa:

Czyli wynika z tego, że to tak jak z lepszością XBoxa nad Playstation, a inne języki są elitarne więc modne jest krytykowanie Java. Tak myślałem

Ponieważ nawet nie poczekałeś, aż więcej osób się wypowie - więc raczej przyszedłeś z gotową tezą, żeby utwierdzić sie w przekonaniu. Nie sądzę żebyć potrzebował argumentów, ani dyskusji, ani żeby cokolwiek to dało.

Tym niemniej jako ćwiczenie dla przyszłych pokoleń zacznijmy od bardzo prostej, a dużo zmieniającej rzeczy z kotlina. data class (czy case class) to taki mały, gówniany ficzurek, który nawet nie jest specjalnie fp... ale zmienia naprawdę dużo.
(Potem pojedziemy w dalsze ficzery i Scalę jak będzie ochota).

Kotlin:

typealias Age = Int
typalias Group = String

data class User (val id: UUID, val name: String, val age: Age, val groups : List<Group>)

Proszę o zapisanie tego w javie.
Można zacząć od samej data class, bez typealiasów.
Raczej nie uda wam się od początku, więc będę podawał czego brakuje i co jest nie tak.
Zadanie jest wykonalne, ale raczej żmudne - zobaczmy.

2
AngryProgrammer napisał(a):

Swoją drogą to ciekawe. Sam się zastanawiałem, co takiego jest w tych wszystkich innych językach, że Java wypada przy nich tak blado, a jak przychodzi to wypisania kilku przykładów by pokazać wyższość języka X nad Javą to nie ma chętnych.

Po prostu nikt nie zbiera sobie takich linków czy przykładów do kolekcji, i nie bardzo chce się komukolwiek szukać ich na żądanie.

Poza tym sprawa była na tym forum wielokrotnie wałkowana, i mi się np. nie chce po raz kolejny udowadniać, czy audi jest lepszym wózkiem od trabanta, czy odwrotnie. Z pamięci, np.
Android bez Javy?
i kolejne wpisy.

1

@jarekr000000:

record Age(Integer value) {}
record Group(String value) {}
record User(UUID id, String name, Age age, List<Group> groups) {}

typealias trochę biedny i na pewno na + w Kotlinie, ale sam data class już Java posiada

1

@Emdzej93: nice try i całkiem dobry początek.
Ale trzeba by teraz uzupełnić o metodę copy

val user1 = ...
val userWithGroupAdded = user1.copy (groups = groups + "kotlinowcy")
val userWithNameChanged = userWithGroupAdded .copy(name = "teratokrzycho")

Uprzedzam, że jest troche pisania, ale specjalnie dałem tylko 4 parametry (edit: w oryginale miały być 3 ale się potknąłem), żeby nie było aż tak dużo (mogłem dać klasę złośliwie z 5cioma...).
Trzeba by się zastanowić jak ładnie ogarnąć w javie named parametry, wiadomo, że nie ma, ale można jakieś patenty zrobić żeby mieć prawie jakby były.

6

No to jak pisales w Kotlinie pol roku, to chyba masz mniej wiecej wyobrazenie dlaczego Java jest taka toporna? :P Przepisalismy swego czasu 2 projekty Java -> Kotlin, w obydwu wypadlo okolo 50% kodu zachowujac cala logike. Polowa kodu mniej do utrzymywania to teoretycznie o polowe mniej bledow. o polowe mniej czytania, o polowe mniej debugowania itp itd.

Co mnie wkurza w Javie?

  • brak czegos takiego jak data class i trzeba sie palowac z lombokiem albo boilerplate'em
  • brak named parameters, przez to musimy przeladowywac te wszystkie metody i konstruktory i hakowac jakimis builderami zeby nie pomylic kolejnosci przekazywanych argumentow
  • bieda w kolekcjach, nie dosc ze mutable to ubogie api
  • CompletableFuture to najlepsze co mamy w Javie do concurrency
  • brakuje monad jak Try, Either, Option
  • jak napiszesz cos funckyjnie to na dwa ekrany generyki wystaja

I ja wiem, ze jak se dodam 12 bibliotek to bede to prawie wszystko mial ale to nadal "prawie" i trzeba je dodac, a nie zawsze sie da w nie swoich projektach

0

Delegacja tez fajna rzecz w Kotlinie

class Orchestrator (
    ...
    someFooImpl: Foo,
    someBarImpl: Bar,
    ...
) : Foo by someFooImpl,
    Bar by someBarImpl
{
    ...
}

val o = Orchestrator( ... )
o.fooMethod()

1

@jarekr000000:

No też się da, o ile o to Ci chodziło... ;) ale niestety trzeba trochę kodu napisać

record User(UUID id, String name, Age age, List<Group> groups) {
    User copyChangeName(String name) {
        return new User(this.id, name, this.age, this.groups);
    }

    User copyAddGroup(Group group) {
        val groups = new ArrayList<>(this.groups);
        groups.add(group);
        return new User(this.id, this.name, this.age, groups);
    }
}
@Test
void javaVsKotlin() {
    val user = new User(UUID.randomUUID(), "johny", new Age(21), Arrays.asList(new Group("Javowcy")));
    val userWithChangedName = user.copyChangeName("jack");
    val userWithNewGroup = user.copyAddGroup(new Group("Kotlinowcy"));
    assertEquals("johny", user.name());
    assertEquals("jack", userWithChangedName.name());
    assertEquals(Arrays.asList(new Group("Javowcy"), new Group("Kotlinowcy")), userWithNewGroup.groups());
    assertTrue(user != userWithChangedName && user != userWithNewGroup);
}
1

@Emdzej93: masz wielkiego plusa, za to, że nie wpadłeś na wielką mine z List :-)

Czy pisałem, że są też kombinacje w copy :-)

val userWithGroupAndNameChanged = user1.copy (groups = groups + "kotlinowcy", name = "teratoniewiemkto")

(chociaż imo, dałoby się bez tych kombinacji żyć).

0

@Emdzej93: to teraz sobie wyobraz ze masz 50 klas po 3-5 pol

1

Właśnie ciesze się że @jarekr000000 wrzucił przykład z 4 polami, ale widzę że już szykuje copy z 2 różnymi parametrami i zaczynam się bać

Czyli właśnie doszliśmy do tego, że całkiem dużo kodu kryje się w małym data class.

Metoda copy to taki mały myk, dzięki któremu pisanie kodu na niemutowalnych strukturach jest całkiem bezproblemowe, gdzie niestety analogiczne podejście w javie powoduje, że chce się czasem wymiotować.
Warto przy tym zaznaczyć, że porównujemy z record który jest dopiero second preview w najnowszej javie. A pomyślmy, że nie wszyscy mają komfort używania preview featerów. Wyobraźmy sobię implementacje tych wszystkich copy w klasycznej javie (np.: 11).

Btw. tu rzecz, na którą już dawno zwróciłem uwagę: java byłaby trochę lepsza gdyby kod pod javę 15 można było skompilować i odpalać na java 8. (Zresztą ktoś już robił przymiarke do takiego kompilatora).

1

https://www.reddit.com/r/java/comments/hyp4me/record_copywith_is_being_worked_on/

tldr:

But, the problem of "withers" is an important one, not only for records,
but for inline classes and for ordinary immutable class. Telling people
"just declare more accessors" would feel a step in the wrong direction.
Our C# friends, leaning on properties, are introducing a with x { ... } construct in C# 9, which is one way to get there, and which I'm
investigating -- but again, there are some roadblocks to clear before we
can get there. Working on it.

Edit#
Faktycznie bez Recordów i Lomboka ten prosty przykład wygląda ciekawie

class User {
    private final UUID id;
    private final String name;
    private final Age age;
    private final List<Group> groups;

    public User(UUID id, String name, Age age, List<Group> groups) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.groups = groups;
    }

    User copyChangeName(String name) {
        return new User(this.id, name, this.age, this.groups);
    }

    User copyAddGroup(Group group) {
        val groups = new ArrayList<>(this.groups);
        groups.add(group);
        return new User(this.id, this.name, this.age, groups);
    }

    public UUID getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public Age getAge() {
        return age;
    }

    public List<Group> getGroups() {
        return groups;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(id, user.id) &&
                Objects.equals(name, user.name) &&
                Objects.equals(age, user.age) &&
                Objects.equals(groups, user.groups);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, age, groups);
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", groups=" + groups +
                '}';
    }
}

class Age {
    private final Integer value;

    public Age(Integer value) {
        this.value = value;
    }

    public Integer getValue() {
        return value;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Age age = (Age) o;
        return Objects.equals(value, age.value);
    }

    @Override
    public int hashCode() {
        return Objects.hash(value);
    }

    @Override
    public String toString() {
        return "Age{" +
                "value=" + value +
                '}';
    }
}

class Group {
    private final String value;

    public Group(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Group group = (Group) o;
        return Objects.equals(value, group.value);
    }

    @Override
    public int hashCode() {
        return Objects.hash(value);
    }

    @Override
    public String toString() {
        return "Group{" +
                "value='" + value + '\'' +
                '}';
    }
}
1

A switch i pattern matching w Kotlinie? Ja wiem że ubogi w stosunku do haskela czy Scali, ale w porównaniu do Javy 8....

2

Kolejna sprawa: testy

https://kotest.io/ vs junit

Oczywiscie mozna Jave testowac Kotlinem ale to tylko sugeruje, ze cos nie gra :)

4

Czasem jest tak, że główny zarzut do języka X to jest to, że nie jest Y. I w ten sposób można się kłócić długo. Tu przykład: podoba mi się to, że w kotlinie wszystko jest by default final i publiczne. Gdzie w javie jest open i "package". Ale to nie jest game changer. I można sie nad tym kłócić, lubić jedno lub drugie.
Kwalifikator internal w kotlinie to już jest coś... ale i w javie jak się użyje modułów (haha ha ) to mamy podobny feature. (package to bieda z nędzą niestety) .

Natomiast są 3 główne powody aby zmienić język:

  1. aby robić mniej błędów
  2. aby robić mniej błędów
  3. aby robić mniej błędów

Można to osiągnąć na kilka sposobów:
a) zwięzła składnia,
b) wyższe poziomy abstrakcji,
c) więcej wiedzy dla kompilatora

a) najłatwiej wytłumaczyć - zwięzła składnia to mniej okazji do popełnienia błędu. Lepiej widać biznes (nie ma tyle śmiecia składniowego) - kotlinowy data class to bardzo dobry przykład (dlatego wybrałem do dyskusji)
b) wymaga niestety opanowania nowych koncepcji - przykład to typeclass. Dzięki temu wiele powtarzalnego kodu da się wyodrębnić i napisać raz. Założę się, że wiekszość z was przynajmniej raz w tygodniu ma do czynienia z monoidem - tylko o tym nie wiecie ¯\_(ツ)_/¯ i powtarzacie ten sam wzorzec. Kłopot z b) jest taki, że tego się nie da w krótkim poście wytłumaczyć. To też częsty powód rozczarowań - wdrażamy Scalę, ale piszemy w Scavie, bo nikt w zespole nawet jednej solidniejszej książki nie przeczytał... i po kilku miesiącach wracamy do javy - jeśli nie stosujemy możliwości to i nie widać różnicy.
c) im więcej wie kompilator tym więcej może powiedzieć o poprawności kodu - tu dobry przykład to sama java, która jest statycznie typowana więc wiele głupich błedów od razu jest wykrywanych. Kłopot w tym, że początkujący programiści pomoc kompilatora biorą raczej jako kłody rzucane pod nogi. Weź pogadaj z typowym pytonowcem albo JS guru co sądzi o typach :-) A java ma tak naprawdę dość biedny system typów i Scala wyciąga o wiele więcej. Niestety jeśli kompilator rzuca dużo więcej kół ratunkowych to czasem programiści pod nimi toną (Scala). Malutki kroczek jaki daje kotlin (null safety) docenicie dość szybko. Ale jak wejść głębiej to czasem naprawę trzeba więcej się napisać (nawet jak mamy type inference), a na pewno trzeba się więcej nagłówkować - w końcu twoja praca to już nie tylko przekładanie bitów w bajtach, tylko dodatkowo przekonanie kompilatora, że twój kod jest poprawny (do jakiegoś poziomu oczywiście).

TLDR;
Czasem wytłumaczenie dlaczego jakiś nowy język jest lepszy wymaga tygodni współpracy. Nie da się tego przekonująco zrobić w kilka blog postów.
Ale zasadniczy cel jest prosty:
Life is too short for X. Gdzie X to:
goto, malloc, void, x=x+1, nullpointerexception, access violation itd...

0

@Bonanzaa: Pozwolę sobie odpowiedzieć z mojego własnego doświadczenia. Zaznaczam - nie jestem żadnym elitarnym programistą. Raczej niedzielnym hobbystą. Na co dzień dłubię sobie w C#.
I nie każdy musi się ze mną zgadzać (pewnie nikt się nie zgodzi, ale napiszę na podstawie własnego osobistego doświadczenia).
Próbowałem przejść na Java (bo o wiele popularniejsza i powszechniejsza). Ale rozbiłem się o mur. BYĆ MOŻE z powodu braku umiejętności, ale nie koniecznie.
Po pierwsze. Instalujesz Visual Studio, tworzysz projekt (nie ma znaczenia, jaki - konsolowy, okienkowy, webowy), wciskasz F5, i.. od razu działa. Zero problemów. W przypadku Java instalujesz Intellij Idea, tworzysz projekt (nie ma znaczenia, jaki), chcesz uruchomić, i... okazuje, się, ze przycisk do uruchamiania jest nieaktywny. Musisz utworzyć zestaw ustawień do uruchamiania. Tworzysz ustawienia, przycisk aktywny, klikasz i... niewłaściwa wersja JDK, niewłaściwa wersja JRE, niewłaściwa wersja jeszcze czegoś itd. Trzeba zainstalować sto wersji wszystkiego, żeby trafić na tą właściwą. Oczywiście, jak już znajdziesz właściwą, to program już uruchamia się bez problemu, ale.. nadal nie jest tak różowo.
Chcesz stworzyć apkę desktopową. Potrzebujesz drzewko folderów. OCZYWIŚCIE w Java je zrobisz. ALE... W Windowsie masz standardowe drzewko zaczynające się od Pulpitu, każdy folder, każdy napęd ma własną ikonkę itp. Zakodowanie tego w C# nie jest zbyt skomplikowane, chociaż pracochłonne. W Java walczyłem z tym kilka tygodni, wreszcie zacząłem szukać na forach i dowiedziałem się, że... się nie da, bo Java jest multiplatformowa, a to znaczy, że nie może mieć windowsowych rozwiązań, bo one nie będą działały pod linuksem i odwrotnie. Czyli jest multiplatformowa, ale nie we wszystkim. Tyko w tym, co jest wspólne dla wszystkich systemów.
I jak próbowałem się przesiąść na Java, to właśnie takie utrudnienia spotykałem na każdym kroku.
Inny przykład. W Visual Studio możesz tworzyć GUI dla programu desktopowego na dwa sposoby: Winforms i WPF (pomijam Xamarin, UWP itp, bo one wszystkie opierają się na języku XAML, czyli tym samym, co WPF). W obu masz pełną kontrolę nad wszystkimi kontrolkami. Zero problemów. Układasz wszystko jak klocki. W Java próbowałem podobnie się bawić. Efekt był taki, że poukładałem kontrolki itp. w jakimś GUI Builderze (sam już nie pamiętam, w jakim). W pewnym momencie coś w jednym miejscu źle wpisałem, i... cały GUI się rozsypał. Kontrolki pouciekały po za okno i już nie udało mi się tego naprawić. Tworzenie GUI w Visual Studio jest ZNACZNIE przyjemniejsze.
Kolejna sprawa. W sumie nawet nie wiem, czy Java ma jakiś odpowiednik języka LINQ, czyli wbudowanego w .NET języka zapytań, który obsługuje zestawy danych tak, jak normalne obiekty. Bardzo przydatne i ułatwiające pracę.
Pisząc w C# cały czas mam poczucie, że działam wewnątrz systemu, że wszystko mi się zgadza i układa. Dłubiąc w Java cały czas się czuję, jak bym dłubał w jakiejś nadbudówce, która tu nie pasuje, tam nie pasuje, gdzie indziej ma przecieki itp itd.. Pisząc w C# masz .NETFrameworka, który jest częścią systemu i wszystko ze wszystkim tam współpracuje. Pisząc w Java mam poczucie, że na wszystko musze szukać jakichś sposobów spoza systemu.
A teraz właśnie rusza nowa wersja .NET 5.0, która ma zintegrowany .NET Framework z .NET Core, dzięki któremu pisanie apek pod windowsa, linuksa, androida i iOS-a ma wyglądać tak samo. Dodatkowo dochodzi Webassembly i Blazor, dzięki któremu będzie można pisać aplikacje webowe nie tylko po stronie serwera, ale i klienta (na froncie już całkowicie bez użycia JavaScriptu - tylko w C#).
Ale to tak na marginesie.
Jeszcze raz zaznaczam - wszystko co tu opisałem to są moje czysto subiektywne odczucia, które może zaraz zostaną wyśmiane. Ale są najmojsze i wzięte z własnej praktyki :)

3

Musisz utworzyć zestaw ustawień do uruchamiania.

Obok maina masz taki zielony guziczek wygladajacy jak "play" i to uruchomi program oraz utworzy ustawienia do uruchomienia.

niewłaściwa wersja JDK, niewłaściwa wersja JRE, niewłaściwa wersja jeszcze czegoś itd.

Razem z IDEA jest instalowana przeciez ich (JetBrainsowa) wersja JDK z ktorej mozesz skorzystac

Chcesz stworzyć apkę desktopową.

W sumie no to Java glownie sluzy do webu albo czystego backendu aleee -->

W Java walczyłem z tym kilka tygodni, wreszcie zacząłem szukać na forach i dowiedziałem się, że... się nie da

No bez przesady. Co konkretnie sie nie da? W sensie nie ma gotowca do czegos czy w ogole sie takiej apki zrobic nie da?

Kolejna sprawa. W sumie nawet nie wiem, czy Java ma jakiś odpowiednik języka LINQ, czyli wbudowanego w .NET języka zapytań, który obsługuje zestawy danych tak, jak normalne obiekty. Bardzo przydatne i ułatwiające pracę.

Streamy?
https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/

Dodatkowo dochodzi Webassembly i Blazor, dzięki któremu będzie można pisać aplikacje webowe nie tylko po stronie serwera, ale i klienta (na froncie już całkowicie bez użycia JavaScriptu - tylko w C#).

No w Kotlinie i Scali (i Javie) tez mozna :)

EDIT:

Trzeba zainstalować sto wersji wszystkiego, żeby trafić na tą właściwą.

Wystarczy tez wybrac zainstalowana wersje w ustawieniach projektu (albo tworzac projekt). D'oh?
Ale mimo wyjasnienia Ci kilku rzeczy i tak chyba mysle, ze Kotlin > C# > Java (ergo i tak JVM > .NET) - ale akurat nie z powodow, ktore podales.

1

@Amor_priv:

  1. dużo prawdy mówisz. (nawiasem mówiąc w NetBeans szybciej się dochodzi do uruchomienia prostego projektu)

  2. natomiast to, że Java realizuje "loose coupling" w stosunku do systemu, ma zalety. (Eksponujesz wady)
    Jak był czas wymiany serwerów 32b ma 64b, w jedną noc niemałą grupę projektów javowskich mieliśmy przesadzoną w 30 minut, resztę nocy pracowicie upgradowaliśmy MS na MS (co miało być prostą higieniczną operacją)

  3. Powtórzę, C# i .NET powstały jako bardzo dobrze wykorzystana okazja do "Javy 2.0" w 10 lat później - gdzie już był kapitał doświadczeń.
    Zresztą, .NET Framework zaszedł z ślepą uliczkę, i trzeba było .NET Core.
    Więc z tamtej strony barykady ideałów projektowania długofalowego też nie ma. Najpierw desktop został zabrany, potem dodany itd

0

Chcesz stworzyć apkę desktopową. Potrzebujesz drzewko folderów. OCZYWIŚCIE w Java je zrobisz. ALE... W Windowsie masz standardowe drzewko zaczynające się od Pulpitu, każdy folder, każdy napęd ma własną ikonkę itp. Zakodowanie tego w C# nie jest zbyt skomplikowane, chociaż pracochłonne. W Java walczyłem z tym kilka tygodni, wreszcie zacząłem szukać na forach i dowiedziałem się, że... się nie da, bo Java jest multiplatformowa, a to znaczy, że nie może mieć windowsowych rozwiązań, bo one nie będą działały pod linuksem i odwrotnie. Czyli jest multiplatformowa, ale nie we wszystkim. Tyko w tym, co jest wspólne dla wszystkich systemów.

Nie znam szczegółów twojego problemu, ale jeśli chodzi o politykę rozwoju Javy to faktycznie wygląda to tak, że nowe API do biblioteki standardowej dorzuca się dopiero, gdy da się zaimplementować (przynajmniej poprawnie, niekoniecznie optymalnie) na wszystkich wiodących platformach na które kompilowane jest OpenJDK (czyli Windows + Linux + macOS). Moim zdaniem ma to jak najbardziej sens, bo co to za wieloplatformowość, gdy program napisany zgodnie z wytycznymi od producenta Javy przestaje działać po zmianie platformy?

Poza tym rozwój desktopowych API w standardowej Javie został zatrzymany. AWT i Swing nie są rozbudowywane, a OpenJFX jest rozwijane poza Oraclem.

No i ostatnia rzecz: skoro ktoś chce koniecznie mieć aplikację przyspawaną do systemu i jego najdrobniejszych bajerów to po co w ogóle mówi cokolwiek o wieloplatformowości?

1 użytkowników online, w tym zalogowanych: 0, gości: 1