-
La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 01:25:24.0 alle 2016-04-08 01:25:24.0https://apple.slashdot.org/story/16/04/07/2124257/...

Dopo Microsoft che rende gratuito Xamarin con la possibilità di programmare in C# su Android, ora anche Google cerca un'alternativa a Java in Android Studio.
</java>-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 01:47:47.0 alle 2016-04-08 01:47:47.0Scritto da:
> https://apple.slashdot.org/story/16/04/07/2124257/...
>
> Dopo Microsoft che rende gratuito Xamarin con la possibilità di programmare in C# su Android, ora anche Google cerca un'alternativa a Java in Android Studio.
>
> </java>
Perché questo dovrebbe rappresentare la morte di Java? Non mi risulta che il suo mercato sia soltanto Android.-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 03:22:37.0 alle 2016-04-08 03:22:37.0Scritto da:
> Scritto da:
> > https://apple.slashdot.org/story/16/04/07/2124257/...
> >
> > Dopo Microsoft che rende gratuito Xamarin con la possibilità di programmare in C# su Android, ora anche Google cerca un'alternativa a Java in Android Studio.
> >
> > </java>
>
> Perché questo dovrebbe rappresentare la morte di Java? Non mi risulta che il suo mercato sia soltanto Android.
In pratica Java è morto su:
- sviluppo applet WEB (ci sono ancora rarissimi casi in cui è usato ma in generale nessuno si fida più di java [né di altri plugin] sul browser e comunque i vari browser stanno sradicando i plugin in toto)
- sviluppo applicazione Desktop (ci sono ancora casi dove è utile ed utilizzato [vedi ad esempio le applicazioni per compilare il 730] ma la quantità di bug nel framework che obbliga l'utente a continui aggiornamenti oltre al fatto di dover distribuire la JVM lo rende poco appetibile)
Sta morendo su Android:
- Microsoft ha reso gratuito Xamarin che permette di sviluppare applicazioni Android con lo stesso linguaggio con cui si sviluppano applicazioni per Windows (C#) che oltretutto è un linguaggio molto piacevole e per nulla verboso come invece è Java.
- Probabilmente grazie ad Oracle (ma forse per via dell'inutile verbosità del linguaggio) ora Google vuole liberarsi di Java
A questo punto resta solo il lato server che esiste ancora solo per il fatto che essendo Java molto "vecchio" ha un sacco di librerie disponibili... ma le altre piattaforme oramai non sono da meno.
Bisogna vedere a questo punto se le nuove generazioni vorranno ancora sorbirsi Java, con tutta la sua inutile e vecchia verbosità e il fatto che se vuoi lavorarci sopra senza dover reinventare la ruota mille volte devi includere varie librerie per cercare di rendere almeno accettabile programmarci sopra.
Alcuni esempi stupidi che però rompono i coglioni:
Voglio comparare due stringhe: stringa1 e stringa2
Java: stringa1.equals(stringa2)
C#: stringa1 == stringa2
Come vedi il metodo C# è molto più naturale, è praticamente il metodo usato da QUALSIASI altro linguaggio moderno, Java è praticamente l'unico linguaggio ancora oggi esistente che richiede quell'assurda forma di comparazione per le stringhe e, infatti, uno degli errori più frequenti di chi passa a Java è di usare l'uguaglianza per il confronto facendo errori difficili da capire per uno che non programma in Java regolarmente.
Altro esempio che mi è capitato proprio 30 secondi fa mentre stavo programmando un App per Android:
Ho una variabile long e vorrei farci un normalissimo switch-case tiposwitch (miaVariabileLong) { case 1: blabla case 32094320423940293402: blabla blablablabla }
Peccato che lo switch-case, per qualche assurda ragione, non funzioni con i long. Funziona per gli int, funziona per i char, funziona per stocazzo, funziona persino con le stringhe (ma solo dalla JDK7, se hai un framework più vecchio col cazzo)... ma per i long... no. Vai a capire perché. Se voglio devo fare uno schifosissimo quanto patetico cast su int... e se la mia variabile è più grande degli int... bé... m'inculo.
Ovviamente in C# lo switch-case funziona anche sui long.
Altra cosa che mi è capitata poco fa sempre su Android: ho una data (dataIniziale) composta da data e ora... e voglio solo la data.
Java (senza librerie esterne):Calendar cal = Calendar.getInstance(); cal.setTime(dataIniziale); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); Date laDataCheVolevo = cal.getTime();
C# (senza librerie esterne):
var laDataCheVolevo = dataIniziale.Date;
Sempre poco fa... voglio sapere quanti giorni ci sono fra due date: data1 e data2
Java (senza librerie esterne):long diff = date2.getTime() - date1.getTime(); long giorni = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);
C# (senza librerie esterne):
var giorni = (date2 - date1).Days;
L'altro giorno... voglio convertire una data in una stringa nel formato yyyy-MM-dd HH:mm:ss... ovvero ad esempio 2016-03-14 12:00:00
Java (senza librerie esterne):
String strData = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(data);
C# (senza librerie esterne)
var strData = data.toString("yyyy-MM-dd HH:mm:ss");
Quale dei due secondo te è il metodo più pulito e chiaro da capire? Perché diavolo in Java devo stare a creare un nuovo oggetto per fare un cazzo di "toString" formattato?
Poi... voglio creare una lista di oggetti di tipo Prenotazione
Java:
ArrayList<Prenotazione> lista = new ArrayList<Prenotazione>();
C#:
var lista = new List<Prenotazione>();
Che motivo c'è di ripetere a sinistra il tipo dell'oggetto che è ovvio da quello che sta scritto a destra? Non c'è. Infatti rende solo il codice più complicato da leggere e da capire, non lo rende affatto più chiaro.
Ancora... ho due pacchetti di dati (diciamo liste, ma potrebbero anche essere dati provenienti da un database) e voglio estrarre alcuni dati dalla prima lista, altri dalla seconda, unendole con un join come si fa con i database e in più voglio mettere dei filtri, ordinare i dati in uscita e creare un oggetto anonimo con la nuova lista risultante.
C# (senza librerie esterne) con LINQ che fa parte del linguaggio:var risultato = from l1 in lista1 join l2 in lista2 on l1.matricola equals l2.matricola where l1.sesso == "M" && l2.lezione == "Informatica" orderby l1.cognome descending select new { Nome = l1.Nome, Cognome = l1.Cognome, OreFrequenza = l2.OreFrequenza }
Java (senza librerie esterne):
Ho paura solo a pensarci. Onestamente non saprei neanche farlo senza dividere il problema in multipli passaggi rompicazzo (tieni conto però che Java lo uso raramente, forse la suora ha una soluzione che non faccia completamente cagare).
LINQ esiste in C# dal framework 3.5, ovvero dal 2008 ed è molto familiare a chi conosce SQL (cioè praticamente tutti i programmatori) quindi non devi impararti cose troppo diverse da quelle che già consoci.
Java 8 (2014) ha finalmente le stream-api e le lambda che semplificano molto la cosa ma per esempio il join non saprei come farlo.
Insomma, se devo scegliere se usare Java o C#, scelgo immediatamente il secondo. È più espressivo di Java, meno verboso e ha un sacco di cose "innate" che in Java richiedono o varie righe di codice o l'uso di librerie esterne. Non c'è motivo per preferire Java a C#... l'unica ragione per cui si usa ancora Java è semplicemente che essendo nato molti anni prima ha una userbase vasta e molte librerie già pronte... ma raramente in C# mi sono trovato a dover includere librerie esterne per fare cose "di ogni giorno"... gran parte di quello che mi serve è già incluso nel framework base. Onestamente, dopo aver usato C#, tornare a Java mi fa sentire come tornare a programmare in Basic.-
Re: La fine di Java su AndroidRispondo in fretta che ho un po' da fare.
1) comparazione di stringhe: == funziona con le stringhe interned (fai s = s.intern() e poi la usi normalmente, l'unico caso in cui ti serve è sulle stringhe create con new String(), i literal sono interned per default).
2) lo switch da java7 prende qualunque Object, pure i long (penso vadano boxati esplicitamente però)
3) ti mancano le API java.time, invece di stackoverflow dovresti guardare i javadoc; prima di java8 usa joda-time (stessa API, package diverso)
e) anche il date formatter è cambiato con java.time
vi) da java 7 il diamond operator fa quello che dici: List<Bestemmia> l = new ArrayList<>(), se vuoi var usa lombok (a prescindere, per ogni progetto usa lombok, srsly)
sette) linq non è un passo avanti imho, se vuoi l'sql typed usa jooq (che a me non piace)
∞) java è più vecchio, e deve molti dei suoi limiti alla retrocompatibilità: una classe compilata con java 1.2 nel 1995 è ancora eseguibile oggi senza alcun problema; i linguaggi che compilano bytecode per la jvm sono un passo in avanti per espressività, scala su tutti. I principale mercato di java rimane il server-side enterprise, dove ci sono dobloni e sesterzi; c# su unix non te lo garantisce nessuna azienda, e i server microsoft fanno cacare e non li vuole nessuno; ho girato negli anni alcuni clienti "enterprise" e java la fa da padrone senza mezzi termini, spinta da ibm, oracle, redhat, hp; java is the new cobol (nel bene e nel male).
Edit: dimenticavo, in c# c'è una transaction API come in java JTA? Gli ejb ti portano gratis il two-phase commit, i light container tipo spring pure; ti faccio l'esempio di quello che mi sta capitando in questi giorni: transazioni ejb eseguite su un cluster di server (quindi pezzi di transazione xa eseguiti su server diversi) che usano db diversi (oracle, mssqlserver, db2) e fa commit o rollback contemporaneamente su tutti i db senza grosse difficoltà e senza che lo sviluppatore debba mettere mano o scrivere codice ad-hoc, basta implementare degli ejb
**Modificato dall'autore il 08.04.2016 08:58**Young professional woman and busy mom.-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 11:43:12.0 alle 2016-04-08 11:43:12.0Scritto da: ::1
> Rispondo in fretta che ho un po' da fare.
>
> 1) comparazione di stringhe: == funziona con le stringhe interned (fai s = s.intern() e poi la usi normalmente, l'unico caso in cui ti serve è sulle stringhe create con new String(), i literal sono interned per default).
Il punto è che una cosa ovvia come una comparazione di stringhe non funziona. Devo stare a fare il giocoliere, a ricordarmi che Java è un caso particolare all'interno dei linguaggi di programmazione. E la cosa brutta è che scrivere stringa1 == stringa2 è perfettamente legale in java perché confronta se si tratta o meno dello stesso oggetto, quindi non ottengo nemmeno un errore che mi possa dire "guarda che ti stai mettendo nella cacca". Per uno che programma sempre e solo in Java questo non è un grosso problema perché si abitua, per uno invece a cui capita di usare spesso linguaggi diversi o per un neofita questo errore lo fa di continuo perché Java è l'unico linguaggio moderno che richiede questa puttanata.
> 2) lo switch da java7 prende qualunque Object, pure i long (penso vadano boxati esplicitamente però)
- devo assicurarmi che ci sia java7 disponibile, e non sempre posso controllare che dal cliente abbiano l'ultima versione del JRE. In alcuni casi non posso nemmeno modificarlo... esempio che mi è capitato: nei comuni. Hanno programmi scritti di merda in java che funzionano solo con il JRE6. Perché non lo so, evidentemente chi ha fatto quei programmi erano un branco di scimmie ubriache, ma se installano una versione più recente si rompe tutto, e naturalmente poi danno la colpa a me perché "prima funzionava"
- lo switch su long (primitivo) non funziona (ci ho provato anche poco fa su Android Studio). Devo stare a fare il cast. Spiegami un po' perché... non c'è un motivo logico per cui lo switch su "int" funziona ma su "long" no. Spiegami perché devo stare a convertire un long in Long (ammesso che funzioni, e mi pare che su Android Studio non funziona, forse in Java "liscio", quindi altre cose da ricordare, altre eccezioni inutili da impararsi).
> 3) ti mancano le API java.time, invece di stackoverflow dovresti guardare i javadoc; prima di java8 usa joda-time (stessa API, package diverso)
> e) anche il date formatter è cambiato con java.time
Si ok, una funzionalità aggiunta solo in Java 8 (con tutto quello che questo significa... assicurarsi che dall'utente sia installato l'ultimo JRE, vedere se la cosa funziona in Android perché non è affatto detto, ecc). In C# queste cose ce le hai dall'età della pietra... in altre parole C# è avanti a Java di anni.
> vi) da java 7 il diamond operator fa quello che dici: List<Bestemmia> l = new ArrayList<>(),
Il codice in C# è ancora più corto. Anche con il diamond operator devi stare a specificare che hai una lista sia a destra che a sinistra... e non si capisce proprio per quale motivo tu debba farlo dato che in nessun modo rende il codice più chiaro, anzi, lo sporca e basta.
> se vuoi var usa lombok (a prescindere, per ogni progetto usa lombok, srsly)
> sette) linq non è un passo avanti imho, se vuoi l'sql typed usa jooq (che a me non piace)
Sono restio ad usare librerie esterne per aggiustare i problemi del linguaggio. Di Java sui server non mi interessa, mi interessa molto più quello su Android... e ogni libreria che aggiungo aumenta le dimensioni dell'APK. Il punto è che queste cose nel 2016 dovrebbero già essere incluse nel linguaggio di default.
> ∞) java è più vecchio, e deve molti dei suoi limiti alla retrocompatibilità: una classe compilata con java 1.2 nel 1995 è ancora eseguibile oggi senza alcun problema;
E la cosa è assurda. Java si sta portando dietro un bagaglio di scelte fatte a cazzo solo per mantenere la compatibilità con del codice scritto 20 anni fa... persino PHP a un certo punto ha capito che se voleva rinnovare il linguaggio doveva per forza abbandonare alcune scelte sbagliate fatte precedentemente... ora, PHP è un brutto esempio perché di scelte sbagliate ne fanno una ogni 2 giorni... ma direi che si potrebbe anche dare una bella limata a Java di tutto ciò che precede Java 1.5 e favorirne un'espressività maggiore.
> i linguaggi che compilano bytecode per la jvm sono un passo in avanti per espressività, scala su tutti. I principale mercato di java rimane il server-side enterprise, dove ci sono dobloni e sesterzi; c# su unix non te lo garantisce nessuna azienda, e i server microsoft fanno cacare e non li vuole nessuno; ho girato negli anni alcuni clienti "enterprise" e java la fa da padrone senza mezzi termini, spinta da ibm, oracle, redhat, hp; java is the new cobol (nel bene e nel male).
Come ho detto. L'unico motivo per cui Java esiste ancora è il mercato server. Però occhio, perché Microsoft ora è molto più "aggressiva" in questo senso. Le cose sono cambiate da poco quindi non c'è da aspettarsi grossi cambiamenti nel breve termine, ma a lungo termine non è affatto detto che le cose restino così come sono ora. C# è un linguaggio semplicemente più bello e moderno di Java e attirerà sempre più persone ora che Microsoft si è finalmente staccata dalla sua politica "Windows a tutti i costi".
> Edit: dimenticavo, in c# c'è una transaction API come in java JTA? Gli ejb ti portano gratis il two-phase commit, i light container tipo spring pure; ti faccio l'esempio di quello che mi sta capitando in questi giorni: transazioni ejb eseguite su un cluster di server (quindi pezzi di transazione xa eseguiti su server diversi) che usano db diversi (oracle, mssqlserver, db2) e fa commit o rollback contemporaneamente su tutti i db senza grosse difficoltà e senza che lo sviluppatore debba mettere mano o scrivere codice ad-hoc, basta implementare degli ejb
Non ti so rispondere, il lato server mi interessa relativamente. Per ora l'ho usato solo per cose relativamente piccole dove non ci sono stati grossi problemi. Hai le transazioni per l'accesso al database (se è questo che intendi), una roba tipo:using (var scope = new TransactionScope()) // fai le tue cose con il database scope.Complete() }
https://msdn.microsoft.com/it-it/library/system.tr...
Non so se è quello che intendi tu ma questo è tutto quello che mi è servito fin'ora. Comunque qui sto parlando del linguaggio in sé, non delle librerie che puoi aggiungerci dietro.
Leggendo qui però http://stackoverflow.com/questions/22512450/c-shar...
sembra che il TransactionScope funzioni anche su database e connessioni diverse, ma come ti dicevo non l'ho mai usato in caso complessi.
-
Re: La fine di Java su AndroidPoi ti rispondo più approfonditamente, però lombok è una libreria a compile-time che non serve includere a runtime. Provala
Young professional woman and busy mom.-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 15:10:36.0 alle 2016-04-08 15:10:36.0Scritto da: ::1
> Poi ti rispondo più approfonditamente, però lombok è una libreria a compile-time che non serve includere a runtime. Provala
Ok, quello però che mi fa paura di questo genere di soluzioni (ovvero librerie esterne che "aggiustano" parti del linguaggio che dovrebbero semplicemente fare parte del linguaggio di base) è che in questo modo finisco per usare un linguaggio che non è più quello base... alla fine mi abituo e quando mi trovo a non poter usare tali librerie mi trovo male perché non so più come si fanno le cose nella versione base.
Senza contare che chiunque voglia un giorno capire il mio codice se non conosce lombok non ci capisce una sega. È anche una delle ragioni per cui preferisco non usare librerie esterne se proprio non devo.
In C# quasi tutto quello che mi serve è fornito "aggratis" e "out of the box" dal linguaggio e dal framework. Ogni tanto, ovviamente, devo includere roba esterna, ma le basi sono già nel linguaggio stesso e nel framework.
-
-
-
-
Re: La fine di Java su AndroidScritto da:
> Java: stringa1.equals(stringa2)
> C#: stringa1 == stringa2
Terribile e confusionario. Il simbolo "==" applicato alle variabili ha significato "Sono il medesimo oggetto" e non "Hanno il medesimo contenuto". Operation Overloading mi ha sempre fatto venire l'orticaria ...
Java da questo punto di vista si comporta in maniera corretta.
Inoltre "equals()" e' un metodo pubblico di Object con un significato ben preciso che va a braccetto con "hashCode()", confonderlo con "==" e' errato e diabolico.
> Ho una variabile long e vorrei farci un normalissimo switch-case tipo
>
>switch (miaVariabileLong) { > case 1: > blabla > case 32094320423940293402: > blabla > blablablabla > }
>
> Peccato che lo switch-case, per qualche assurda ragione, non funzioni con i long.switch (miaVariabileLong.intValue()) { case 1: blabla case 32094320423940293402: blabla blablablabla }
oppureswitch (miaVariabileLong) { case 1L: blabla case 32094320423940293402L: blabla blablablabla }
Non mi pare cosi' difficile
> Altra cosa che mi è capitata poco fa sempre su Android: ho una data (dataIniziale) composta da data e ora... e voglio solo la data.
Spari sulla croce rosse, Calendar in Java fa cacare
Per questa ragione da Java8 c'e' java.time. Dacci un'occhiata: http://javadocs.techempower.com/jdk18/api/java/tim...
> Poi... voglio creare una lista di oggetti di tipo Prenotazione
>
> Java:
> ArrayList<Prenotazione> lista = new ArrayList<Prenotazione>();
Meglio
List<Prenotazione> lista = new ArrayList<>();
Oppure usa "Collection" invece che "List"
> Che motivo c'è di ripetere a sinistra il tipo dell'oggetto che è ovvio da quello che sta scritto a destra? Non c'è.
Si che c'e', si chiama Inheritance, ecco perche' ho usato "List" o "Collection"
> Ancora... ho due pacchetti di dati (diciamo liste, ma potrebbero anche essere dati provenienti da un database) e voglio estrarre alcuni dati dalla prima lista, altri dalla seconda, unendole con un join come si fa con i database e in più voglio mettere dei filtri, ordinare i dati in uscita e creare un oggetto anonimo con la nuova lista risultante.
>
> C# (senza librerie esterne) con LINQ che fa parte del linguaggio:
>var risultato = from l1 in lista1 > join l2 in lista2 on l1.matricola equals l2.matricola > where l1.sesso == "M" && l2.lezione == "Informatica" > orderby l1.cognome descending > select new { > Nome = l1.Nome, > Cognome = l1.Cognome, > OreFrequenza = l2.OreFrequenza > }
>
> Java (senza librerie esterne):
> Ho paura solo a pensarci.
Questo perche' non conosci java.util.stream: http://javadocs.techempower.com/jdk18/api/java/uti...
> Insomma, se devo scegliere se usare Java o C#, scelgo immediatamente il secondo.
Io sceglierei Groovy, ma del resto tra lavorare e passare la giornata dondolandomi in un'amaca, sceglierei immediatamente la seconda
**Modificato dall'autore il 08.04.2016 09:38**`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 13:02:20.0 alle 2016-04-08 13:02:20.0Scritto da: Giambo
> Scritto da:
>
> > Java: stringa1.equals(stringa2)
> > C#: stringa1 == stringa2
>
> Terribile e confusionario. Il simbolo "==" applicato alle variabili ha significato "Sono il medesimo oggetto" e non "Hanno il medesimo contenuto". Operation Overloading mi ha sempre fatto venire l'orticaria ...
> Java da questo punto di vista si comporta in maniera corretta.
Non sono d'accordo con la tua idea che l'opeator overloading sia "il male". Va usato con parsimonia, questo sì, ma quando è usato correttamente rende il codice molto più chiaro, come è appunto il caso con le stringhe. Con le stringhe un confronto di oggetti non è quasi mai quello che vuoi avere (in tutti questi anni a me non è MAI capitato di voler vedere se due oggetti stringa fossero lo stesso oggetto), vuoi sapere se il loro valore è lo stesso. Ha quindi senso ridefinire l'operatore "==". Questo rende il codice più facile da leggere, più "coerente" con gli altri linguaggi lì fuori ed è meno error-prone per qualcuno alle prime armi o che usa java saltuariamente.
> Inoltre "equals()" e' un metodo pubblico di Object con un significato ben preciso che va a braccetto con "hashCode()", confonderlo con "==" e' errato e diabolico.
Come ho detto, l'operator overloading esiste in OO e serve proprio nei casi tipo l'oggetto stringa. Che a te non piaccia è un altro discorso ma:
if (miaStringa == "ciao") ...
è più chiaro e bello da leggere di
if (miaStringa.equals("ciao")) ...
Quando uno fa un confronto fra stringhe si aspetta che venga testato il valore, non l'istanza dell'oggetto stringa.
Se poi improvvisamente ti senti un fanatico purista della "filosofia object oriented" spiegami come mai in Java esistono i tipi base che non sono oggetti... questa sì che è un'assurdità in un linguaggio in cui non puoi fare nulla senza oggetti, nemmeno avviare il programma (e infatti devi stare a crearti un'inutile oggetto wrapper attorno a "main").
https://msdn.microsoft.com/it-it/library/ms228360(...
> > Ho una variabile long e vorrei farci un normalissimo switch-case tipo
> >
> >switch (miaVariabileLong) { > > case 1: > > blabla > > case 32094320423940293402: > > blabla > > blablablabla > > }
> >
> > Peccato che lo switch-case, per qualche assurda ragione, non funzioni con i long.
>
>switch (miaVariabileLong.intValue()) { > case 1: > blabla > case 32094320423940293402: > blabla > blablablabla > }
>
> oppure
>
>switch (miaVariabileLong) { > case 1L: > blabla > case 32094320423940293402L: > blabla > blablablabla > }
>
> Non mi pare cosi' difficile
A parte il secondo esempio che ad esempio su Android Studio non va (quindi devo pure stare a ricordarmi che su Java "liscio" va mentre su Java-Android no) io non ho detto che è impossibile farlo. Ho detto che non esiste motivo per cui lo switch debba funzionare su int ma non su long senza cast, boxing e altre amenità.
> > Altra cosa che mi è capitata poco fa sempre su Android: ho una data (dataIniziale) composta da data e ora... e voglio solo la data.
>
> Spari sulla croce rosse, Calendar in Java fa cacare
> Per questa ragione da Java8 c'e' java.time. Dacci un'occhiata: http://javadocs.techempower.com/jdk18/api/java/tim...
Lo conosco, ma vedi la risposta che ho dato alla Suora.
Stiamo parlando in pratica di novità aggiunte da poco più di un anno quando queste cose esistevano in C# dagli albori.
> > Poi... voglio creare una lista di oggetti di tipo Prenotazione
> >
> > Java:
> > ArrayList<Prenotazione> lista = new ArrayList<Prenotazione>();
>
> Meglio
> List<Prenotazione> lista = new ArrayList<>();
>
> Oppure usa "Collection" invece che "List"
Si, ma devi comunque ripetere sia a destra che a sinistra che si tratta di liste... e non esiste motivo per farlo.
>
> > Che motivo c'è di ripetere a sinistra il tipo dell'oggetto che è ovvio da quello che sta scritto a destra? Non c'è.
>
> Si che c'e', si chiama Inheritance, ecco perche' ho usato "List" o "Collection"
Lo puoi fare anche in C# se ti serve... ma nella stragrande maggioranza dei casi ciò che sta a sinistra è uguale a ciò che sta a destra, perciò ripetersi non ha senso. Ti fa solo scrivere di più e rende il codice più incasinato da capire o, come lo vedo io, "più sporco".
>
> > Ancora... ho due pacchetti di dati (diciamo liste, ma potrebbero anche essere dati provenienti da un database) e voglio estrarre alcuni dati dalla prima lista, altri dalla seconda, unendole con un join come si fa con i database e in più voglio mettere dei filtri, ordinare i dati in uscita e creare un oggetto anonimo con la nuova lista risultante.
> >
> > C# (senza librerie esterne) con LINQ che fa parte del linguaggio:
> >var risultato = from l1 in lista1 > > join l2 in lista2 on l1.matricola equals l2.matricola > > where l1.sesso == "M" && l2.lezione == "Informatica" > > orderby l1.cognome descending > > select new { > > Nome = l1.Nome, > > Cognome = l1.Cognome, > > OreFrequenza = l2.OreFrequenza > > }
> >
> > Java (senza librerie esterne):
> > Ho paura solo a pensarci.
>
> Questo perche' non conosci java.util.stream: http://javadocs.techempower.com/jdk18/api/java/uti...
Lo conosco (altra novità di java 8 [2014], mentre in C# questa roba esiste da almeno il 2008... in java hanno impiegato 6 anni per aggiornarsi... complimenti...), ma LINQ è semplicemente più familiare. Fra l'altro LINQ può essere scritto anche nel "formato" funzionale con le lambda proprio come le stream-api.
Ma anche se conosco le stream-api non so ancora come si fa il join.
Riesci a convertirmi il codice che ho scritto in LINQ nell'equivalente stream-api così che posso vedere come si fa il join?
> > Insomma, se devo scegliere se usare Java o C#, scelgo immediatamente il secondo.
>
> Io sceglierei Groovy, ma del resto tra lavorare e passare la giornata dondolandomi in un'amaca, sceglierei immediatamente la seconda
A me invece programmare piace, ma quando ho a che fare con un linguaggio inutilmente verboso mi viene voglia di dedicarmi ad altro, soprattutto se so che ci sono alternative migliori.-
Re: La fine di Java su AndroidScritto da:
> > > Java: stringa1.equals(stringa2)
> > > C#: stringa1 == stringa2
> >
> > Terribile e confusionario. Il simbolo "==" applicato alle variabili ha significato "Sono il medesimo oggetto" e non "Hanno il medesimo contenuto". Operation Overloading mi ha sempre fatto venire l'orticaria ...
> > Java da questo punto di vista si comporta in maniera corretta.
>
> Non sono d'accordo con la tua idea che l'opeator overloading sia "il male". Va usato con parsimonia, questo sì, ma quando è usato correttamente rende il codice molto più chiaro, come è appunto il caso con le stringhe.
Per me invece non e' necessario, e la confusione che genera supera i benefici.
> Con le stringhe un confronto di oggetti non è quasi mai quello che vuoi avere
Con gli "oggetti" invece capita spesso, difficile immaginare un sistema di caching semplice e efficiente che non lo permetta.
> > Inoltre "equals()" e' un metodo pubblico di Object con un significato ben preciso che va a braccetto con "hashCode()", confonderlo con "==" e' errato e diabolico.
>
> Come ho detto, l'operator overloading esiste in OO e serve proprio nei casi tipo l'oggetto stringa. Che a te non piaccia è un altro discorso ma:
> if (miaStringa == "ciao") ...
> è più chiaro e bello da leggere di
> if (miaStringa.equals("ciao")) ...if (mioOggetto == altroOggetto) { ... } else { ... }
Cosa fa "==" ? Confronta se e' la medesima istanza o richiama un'implementazione interna di mioOggetto ?
Inoltre, cos'e' "mioOggetto" ? E' una referenza, quindi perche' "==" dovrebbe agire sull'oggetto referenziato e non sulla vero soggetto, cioe' la referenza ?
> Se poi improvvisamente ti senti un fanatico purista della "filosofia object oriented" spiegami come mai in Java esistono i tipi base che non sono oggetti...
Questione di performance di taaaaanti anni fa. Poi hanno cercato di rimediare con l'autoboxing ...
Non e' l'unica idiosincrasia, c'e' pure l'operator overloading "+" per concatenare le stringe
> >switch (miaVariabileLong) { > > case 1L: > > blabla > > case 32094320423940293402L: > > blabla > > blablablabla > > }
> >
> > Non mi pare cosi' difficile
>
> A parte il secondo esempio che ad esempio su Android Studio non va (quindi devo pure stare a ricordarmi che su Java "liscio" va mentre su Java-Android no)
Eh
? Che errore ti da ?
> > Spari sulla croce rosse, Calendar in Java fa cacare
> > Per questa ragione da Java8 c'e' java.time. Dacci un'occhiata: http://javadocs.techempower.com/jdk18/api/java/tim...
>
> Lo conosco, ma vedi la risposta che ho dato alla Suora.
> Stiamo parlando in pratica di novità aggiunte da poco più di un anno quando queste cose esistevano in C# dagli albori.
C# e' anche arrivato molto dopo Java, ne harubatopreso tante idee buone e ha evitato le piccole cattive.
> > > Poi... voglio creare una lista di oggetti di tipo Prenotazione
> > >
> > > Java:
> > > ArrayList<Prenotazione> lista = new ArrayList<Prenotazione>();
> >
> > Meglio
> > List<Prenotazione> lista = new ArrayList<>();
> >
> > Oppure usa "Collection" invece che "List"
>
> Si, ma devi comunque ripetere sia a destra che a sinistra che si tratta di liste...
No no no no. Una e' una List, l'altra e' una Collection. Sono due cose diverse.
Un Set e' una Collection con la peculiarita' che non accetta duplicati e che l'ordine di iterazione non e' uguale all'ordine di inserimento.
Una List e' una Collection con la peculiarita' che accetta duplicati e che l'ordine di iterazione e' uguale all'ordine di inserimento.
Se non vuoi restringere la funzionalita' della tua collezione, non far sapere a chi usa l'API di che tipo si tratta, allora userai Collection.
Se vuoi che si sappia che e' una Lista, userai List.
Se vuoi che si sappia anche il tipo di implementazione, userai ArrayList o LinkedList.
> e non esiste motivo per farlo.
Il motivo esiste ed e' appunto l'inheritance/polimorfismo.
> > > Che motivo c'è di ripetere a sinistra il tipo dell'oggetto che è ovvio da quello che sta scritto a destra? Non c'è.
> >
> > Si che c'e', si chiama Inheritance, ecco perche' ho usato "List" o "Collection"
>
> Lo puoi fare anche in C# se ti serve... ma nella stragrande maggioranza dei casi ciò che sta a sinistra è uguale a ciò che sta a destra, perciò ripetersi non ha senso.
Anche in Java e' la medesima cosa, la differenza sta in quello che "esponi".
> Ti fa solo scrivere di più e rende il codice più incasinato da capire o, come lo vedo io, "più sporco".
E invece e' molto, molto importante che tu possa esporre solo l'interfaccia List o Collection, e non la vera implementazione che ci sta dietro.
> > > Java (senza librerie esterne):
> > > Ho paura solo a pensarci.
> >
> > Questo perche' non conosci java.util.stream: http://javadocs.techempower.com/jdk18/api/java/uti...
>
> Lo conosco
Se le cose lo sai, perche' fai finta di non saperle ?
> Ma anche se conosco le stream-api non so ancora come si fa il join.
> Riesci a convertirmi il codice che ho scritto in LINQ nell'equivalente stream-api così che posso vedere come si fa il join?
No, non conosco abbastanza LINQ. E poi per oggi ho fatto la Maestrina abbastanza, non credi
?
**Modificato dall'autore il 08.04.2016 13:58**`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 14:20:01.0 alle 2016-04-08 14:20:01.0Scritto da: Giambo
> > Non sono d'accordo con la tua idea che l'opeator overloading sia "il male". Va usato con parsimonia, questo sì, ma quando è usato correttamente rende il codice molto più chiaro, come è appunto il caso con le stringhe.
>
> Per me invece non e' necessario, e la confusione che genera supera i benefici.
La confusione è SEMPRE male.
> > Con le stringhe un confronto di oggetti non è quasi mai quello che vuoi avere
>
> Con gli "oggetti" invece capita spesso, difficile immaginare un sistema di caching semplice e efficiente che non lo permetta.
Qui stiamo parlando di stringhe. Quante volte devi scrivere un sistema di caching e quante volte devi scrivere if (miaStringa == "valore") ?
>> if (mioOggetto == altroOggetto) { > ... > } else { > ... > } >
>
> Cosa fa "==" ? Confronta se e' la medesima istanza o richiama un'implementazione interna di mioOggetto ?
> Inoltre, cos'e' "mioOggetto" ? E' una referenza, quindi perche' "==" dovrebbe agire sull'oggetto referenziato e non sulla vero soggetto, cioe' la referenza ?
Come ho detto, va usato con parsimonia, e quando lo usi deve essere chiaro a chiunque metta mano sul tuo codice che hai fatto l'overloading. Nel caso delle stringhe ha perfettamente senso, inoltre è proprio quello che chiunque si aspetta succeda. Non è un caso che chiunque provi java per la prima volta sbaglia immediatamente testando l'unquaglianza fra stringhe.
> Questione di performance di taaaaanti anni fa. Poi hanno cercato di rimediare con l'autoboxing ...
> Non e' l'unica idiosincrasia, c'e' pure l'operator overloading "+" per concatenare le stringe
Quindi come vedi C# è più coerente con l'OO di Java.
> > A parte il secondo esempio che ad esempio su Android Studio non va (quindi devo pure stare a ricordarmi che su Java "liscio" va mentre su Java-Android no)
>
> Eh
? Che errore ti da ?
Codice di test:long pippo = 3; switch(pippo) { case 3L: break; }
"Incompatible Types. Found: 'long', required: 'char, byte, short, blabla.......'"
Questo me lo dice direttamente l'IDE di Android Studio, se clicco "compila" mi da errore in compilazione.
> C# e' anche arrivato molto dopo Java, ne harubatopreso tante idee buone e ha evitato le piccole cattive.
Quindi siamo d'accordo che C# è migliore di Java. Fra l'altro C# ha introdotto un sacco di novità già da subito. LINQ ad esempio è stato aggiunto nel 2008... molto prima che Java introducesse le stream-api.
> No no no no. Una e' una List, l'altra e' una Collection. Sono due cose diverse.
Ripeto, puoi farlo anche in C#, SE è quello che vuoi.
Nella gran parte dei casi vuoi semplicemente che ciò che sta a sinistra sia uguale come tipo a ciò che sta a destra.
> > e non esiste motivo per farlo.
>
> Il motivo esiste ed e' appunto l'inheritance/polimorfismo.
Non esiste motivo per farlo QUANDO non vuoi inheritance/polimorfismo. In Java sei OBBLIGATO a farlo anche in quei casi. In C# no.
> > Lo puoi fare anche in C# se ti serve... ma nella stragrande maggioranza dei casi ciò che sta a sinistra è uguale a ciò che sta a destra, perciò ripetersi non ha senso.
>
> Anche in Java e' la medesima cosa, la differenza sta in quello che "esponi".
Come lo fai? Mostrami un esempio senza usare Lombok o altre librerie esterne che "aggiustano" il linguaggio.
Esempio in C#
var pippo = new StringBuilder();
>
> > Ti fa solo scrivere di più e rende il codice più incasinato da capire o, come lo vedo io, "più sporco".
>
> E invece e' molto, molto importante che tu possa esporre solo l'interfaccia List o Collection, e non la vera implementazione che ci sta dietro.
Santo dio, l'hai o non l'hai ancora capito che non è affatto quello che intendo io?
>
> > > > Java (senza librerie esterne):
> > > > Ho paura solo a pensarci.
> > >
> > > Questo perche' non conosci java.util.stream: http://javadocs.techempower.com/jdk18/api/java/uti...
> >
> > Lo conosco
>
> Se le cose lo sai, perche' fai finta di non saperle ?
Perché non è flessibile come è LINQ... pur essendo nato con 6 anni di ritardo. Fra l'altro LINQ puoi scriverlo in due modi... quello in cui l'ho scritto io, oppure in modo funzionale che è simile a quello delle stream-api in Java.
> > Ma anche se conosco le stream-api non so ancora come si fa il join.
> > Riesci a convertirmi il codice che ho scritto in LINQ nell'equivalente stream-api così che posso vedere come si fa il join?
>
> No, non conosco abbastanza LINQ. E poi per oggi ho fatto la Maestrina abbastanza, non credi
?
Non ti serve sapere LINQ. Quello è quasi identico all'SQL.
Aspetta che ti aiuto:
http://stackoverflow.com/questions/28616368/what-i...
"I haven't found any existing equivalent [ma se vuoi puoi scrivere la pappardella qui sotto per fare quello che in LINQ fai con un comando solo già 'out of the box' dal 2008]"
-
Re: La fine di Java su AndroidScritto da:
> > > Con le stringhe un confronto di oggetti non è quasi mai quello che vuoi avere
> >
> > Con gli "oggetti" invece capita spesso, difficile immaginare un sistema di caching semplice e efficiente che non lo permetta.
>
> Qui stiamo parlando di stringhe. Quante volte devi scrivere un sistema di caching e quante volte devi scrivere if (miaStringa == "valore") ?
Quindi == ha un significato diverso in caso di stringhe o in caso di altri oggetti
?
> Come ho detto, va usato con parsimonia, e quando lo usi deve essere chiaro a chiunque metta mano sul tuo codice che hai fatto l'overloading.
Quindi prima fai casino con l'overloading, poi cerchi di mitigare scrivendo dei commenti in bold nelle tue API
?
Non era meglio, a questo punto, evitare l'ambiguita' e usare "equals()" invece che "==" ? 6 caratteri in piu' li sacrifico volontariamente all'altare del Principle of Least Surprise.
> > > A parte il secondo esempio che ad esempio su Android Studio non va (quindi devo pure stare a ricordarmi che su Java "liscio" va mentre su Java-Android no)
> >
> > Eh
? Che errore ti da ?
>
> Codice di test:
>long pippo = 3; > switch(pippo) { > case 3L: > break; > }
>
> "Incompatible Types. Found: 'long', required: 'char, byte, short, blabla.......'"
> Questo me lo dice direttamente l'IDE di Android Studio, se clicco "compila" mi da errore in compilazione.
Porchiddio, perche' ero convinto che funzionasse
?
Vabbeh, mi sa che dovrai metterci .intValue() nello switch o, meglio, provare con gli Enum
> > C# e' anche arrivato molto dopo Java, ne harubatopreso tante idee buone e ha evitato le piccole cattive.
>
> Quindi siamo d'accordo che C# è migliore di Java.
Le facolta' di informatica sono piene di cadaveri di linguaggi "migliori"
Il successo di un linguaggio viene determinato da tanti fattori. Il C e' stato il linguaggio migliore al suo tempo ? E COBOL ? Lisp ?
Di fatto C# e' nato e cresciuto all'ombra di Java e nonostante tutti gli sforzi combinati di Microsoft e Oracle, non e' ancora riuscito a scalzarlo
`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 15:19:26.0 alle 2016-04-08 15:19:26.0Scritto da: Giambo
> Scritto da:
>
> > > > Con le stringhe un confronto di oggetti non è quasi mai quello che vuoi avere
> > >
> > > Con gli "oggetti" invece capita spesso, difficile immaginare un sistema di caching semplice e efficiente che non lo permetta.
> >
> > Qui stiamo parlando di stringhe. Quante volte devi scrivere un sistema di caching e quante volte devi scrivere if (miaStringa == "valore") ?
>
> Quindi == ha un significato diverso in caso di stringhe o in caso di altri oggetti
?
>
> > Come ho detto, va usato con parsimonia, e quando lo usi deve essere chiaro a chiunque metta mano sul tuo codice che hai fatto l'overloading.
>
> Quindi prima fai casino con l'overloading, poi cerchi di mitigare scrivendo dei commenti in bold nelle tue API
?
> Non era meglio, a questo punto, evitare l'ambiguita' e usare "equals()" invece che "==" ? 6 caratteri in piu' li sacrifico volontariamente all'altare del Principle of Least Surprise.
>
> > > > A parte il secondo esempio che ad esempio su Android Studio non va (quindi devo pure stare a ricordarmi che su Java "liscio" va mentre su Java-Android no)
> > >
> > > Eh
? Che errore ti da ?
> >
> > Codice di test:
> >long pippo = 3; > > switch(pippo) { > > case 3L: > > break; > > }
> >
> > "Incompatible Types. Found: 'long', required: 'char, byte, short, blabla.......'"
> > Questo me lo dice direttamente l'IDE di Android Studio, se clicco "compila" mi da errore in compilazione.
>
> Porchiddio, perche' ero convinto che funzionasse
?
> Vabbeh, mi sa che dovrai metterci .intValue() nello switch o, meglio, provare con gli Enum
>
> > > C# e' anche arrivato molto dopo Java, ne harubatopreso tante idee buone e ha evitato le piccole cattive.
> >
> > Quindi siamo d'accordo che C# è migliore di Java.
>
> Le facolta' di informatica sono piene di cadaveri di linguaggi "migliori"
> Il successo di un linguaggio viene determinato da tanti fattori. Il C e' stato il linguaggio migliore al suo tempo ? E COBOL ? Lisp ?
>
> Di fatto C# e' nato e cresciuto all'ombra di Java e nonostante tutti gli sforzi combinati di Microsoft e Oracle, non e' ancora riuscito a scalzarlo
>
Colpa dei ex sparagestionali ex cacciavitari che rubano il lavoro ai professionisti.
-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 15:21:41.0 alle 2016-04-08 15:21:41.0Scritto da: Giambo
> Scritto da:
>
> > > > Con le stringhe un confronto di oggetti non è quasi mai quello che vuoi avere
> > >
> > > Con gli "oggetti" invece capita spesso, difficile immaginare un sistema di caching semplice e efficiente che non lo permetta.
> >
> > Qui stiamo parlando di stringhe. Quante volte devi scrivere un sistema di caching e quante volte devi scrivere if (miaStringa == "valore") ?
>
> Quindi == ha un significato diverso in caso di stringhe o in caso di altri oggetti
?
Si chiama "operator overloading" e fa parte della filosofia OO oramai da un bel pezzo.
> > Come ho detto, va usato con parsimonia, e quando lo usi deve essere chiaro a chiunque metta mano sul tuo codice che hai fatto l'overloading.
>
> Quindi prima fai casino con l'overloading, poi cerchi di mitigare scrivendo dei commenti in bold nelle tue API
?
> Non era meglio, a questo punto, evitare l'ambiguita' e usare "equals()" invece che "==" ? 6 caratteri in piu' li sacrifico volontariamente all'altare del Principle of Least Surprise.
Non fai nessun casino. Il casino lo fai a voler insistere ad usare equals anziché == nel caso delle stringhe.
>
> > > > A parte il secondo esempio che ad esempio su Android Studio non va (quindi devo pure stare a ricordarmi che su Java "liscio" va mentre su Java-Android no)
> > >
> > > Eh
? Che errore ti da ?
> >
> > Codice di test:
> >long pippo = 3; > > switch(pippo) { > > case 3L: > > break; > > }
> >
> > "Incompatible Types. Found: 'long', required: 'char, byte, short, blabla.......'"
> > Questo me lo dice direttamente l'IDE di Android Studio, se clicco "compila" mi da errore in compilazione.
>
> Porchiddio, perche' ero convinto che funzionasse
?
> Vabbeh, mi sa che dovrai metterci .intValue() nello switch o, meglio, provare con gli Enum
Quindi ora non sappiamo nemmeno se funziona nella versione Java liscia?
>
> > > C# e' anche arrivato molto dopo Java, ne harubatopreso tante idee buone e ha evitato le piccole cattive.
> >
> > Quindi siamo d'accordo che C# è migliore di Java.
>
> Le facolta' di informatica sono piene di cadaveri di linguaggi "migliori"
> Il successo di un linguaggio viene determinato da tanti fattori. Il C e' stato il linguaggio migliore al suo tempo ? E COBOL ? Lisp ?
>
> Di fatto C# e' nato e cresciuto all'ombra di Java e nonostante tutti gli sforzi combinati di Microsoft e Oracle, non e' ancora riuscito a scalzarlo
A me non interessa quali sono i linguaggi più usati. A me interessa quali sono i linguaggi più chiari, non verbosi, fortemente tipizzati, dotati di garbage collector, ecc. perché questo ti impedisce di fare cazzate e ti rende la vita più facile come programmatore.
C# rientra fra questi, Java no.
-
Re: La fine di Java su AndroidScritto da:
> > > > > Con le stringhe un confronto di oggetti non è quasi mai quello che vuoi avere
> > > >
> > > > Con gli "oggetti" invece capita spesso, difficile immaginare un sistema di caching semplice e efficiente che non lo permetta.
> > >
> > > Qui stiamo parlando di stringhe. Quante volte devi scrivere un sistema di caching e quante volte devi scrivere if (miaStringa == "valore") ?
> >
> > Quindi == ha un significato diverso in caso di stringhe o in caso di altri oggetti
?
>
> Si chiama "operator overloading" e fa parte della filosofia OO oramai da un bel pezzo.
E' una parte del polimorfismo al quale si puo' (Dovrebbe) fare volentieri a meno in nome della chiarezza; un'assenza in molti linguaggi di programmazione della quale nessuno sente la mancanza
> > > Come ho detto, va usato con parsimonia, e quando lo usi deve essere chiaro a chiunque metta mano sul tuo codice che hai fatto l'overloading.
> >
> > Quindi prima fai casino con l'overloading, poi cerchi di mitigare scrivendo dei commenti in bold nelle tue API
?
> > Non era meglio, a questo punto, evitare l'ambiguita' e usare "equals()" invece che "==" ? 6 caratteri in piu' li sacrifico volontariamente all'altare del Principle of Least Surprise.
>
> Non fai nessun casino.
Poter ridefinire un operatore per fare tazzi e mazzi non e' casino
?
Citando gli sviluppatori di Google GO "things are simpler without it."
> > > > C# e' anche arrivato molto dopo Java, ne harubatopreso tante idee buone e ha evitato le piccole cattive.
> > >
> > > Quindi siamo d'accordo che C# è migliore di Java.
> >
> > Le facolta' di informatica sono piene di cadaveri di linguaggi "migliori"
> > Il successo di un linguaggio viene determinato da tanti fattori. Il C e' stato il linguaggio migliore al suo tempo ? E COBOL ? Lisp ?
> >
> > Di fatto C# e' nato e cresciuto all'ombra di Java e nonostante tutti gli sforzi combinati di Microsoft e Oracle, non e' ancora riuscito a scalzarlo
>
> A me non interessa quali sono i linguaggi più usati.
Dovresti, se ti vuoi guadagnare da vivere come programmatore.
> A me interessa quali sono i linguaggi più chiari, non verbosi, fortemente tipizzati, dotati di garbage collector, ecc. perché questo ti impedisce di fare cazzate e ti rende la vita più facile come programmatore.
> C# rientra fra questi, Java no.
Hai dimenticato un IMHO, o forse non sai che Java e' chiaro, fortemente tipizzato e dotato di garbage collector (Quest'ultimo non e' una caratteristica del linguaggio).`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 16:32:26.0 alle 2016-04-08 16:32:26.0Scritto da: Giambo
> E' una parte del polimorfismo al quale si puo' (Dovrebbe) fare volentieri a meno in nome della chiarezza; un'assenza in molti linguaggi di programmazione della quale nessuno sente la mancanza
Eppure c'è, e ha i suoi usi legittimi. Uno fra tutti... il confronto fra stringhe.
Inoltre ha molto senso quando ad esempio stai creando una libreria matematica con nuovi tipi di oggetto che devono essere sommati, sottratti, ecc.
Metti che vuoi implementare l'Analisi non Standard in cui infinito e infinitesimo sono a tutti gli effetti numeri. Quindi possono essere sommati e sottratti fra loro, ecc.
Siccome in Java quando vuoi sommare due numeri non fai
4.add(3) ma fai 4 + 3 (altra inconsistenza che apparentemente a te va benissimo [non si capisce infatti perché a te vada bene usare 4 == 4 anziché 4.equals(4) oppure 3 + 4 anziché 3.add(4) ma stranamente quando si tratta di stringhe fai tutte queste storie]) vuoi che anche i tuoi numeri funzionino allo stesso modo. Quindi creerai la classe "intNS" (int non standard) che reimplementa somma, sottrazione, divisione, ecc. E così ottieni dei numeri che si comportano esattamente come tutti gli altri.
> Poter ridefinire un operatore per fare tazzi e mazzi non e' casino
?
> Citando gli sviluppatori di Google GO "things are simpler without it."
GO non so nemmeno se può definirsi "object oriented"... che io ricordi non ha nemmeno il concetto di inheritance che, da quanto ricordo, è piuttosto centrale in OOP. Tuttavia, guardacaso, anche in GO le stringhe si confrontano con == e non con .equals
GO è un bel linguaggio, è coinciso, espressivo... inoltre non ti obbliga ad usare l'OOP se non ti serve. Ti da gli strumenti e poi ti dice "usali nel migliore dei modi che conosci" in questo modo ti lascia la libertà di scegliere quando fare una cosa in sile OO e quando invece è preferibile uno stile più procedurale.
> Dovresti, se ti vuoi guadagnare da vivere come programmatore.
Io non ho mai ragionato così. A me piace la chiarezza, mi piace un linguaggio che mi impedisca di fare cazzate (per questo detesto ad esempio javascript), mi piace un linguaggio che io trovi divertente da scrivere e che non mi obblighi a fracassarmi le mani per scrivere cose ovvie (come ad esempio che il tipo che sta a destra è lo stesso che sta a sinistra in un assegnamento... sembrerà una cazzata, ma mi da un sacco fastidio). Un sacco di problemi e bug gravi (ad esempio in C e C++, tipo quelli che permettono all'NSA di nasarti il PC) sono dovuti proprio alla mancanza di chiarezza e semplicità. Quando un linguaggio diventa noioso, difficile da capire, ecc... in quel momento fai inevitabilmente cazzate.
Se avessi voluto guadagnare e vivere da Re avrei seguito i consigli di mio padre sul lasciare la programmazione in toto e diventare invece un notaio... ma io sono un programmatore perché MI PIACE programmare, non per il conto in banca.
> Hai dimenticato un IMHO, o forse non sai che Java e' chiaro, fortemente tipizzato e dotato di garbage collector (Quest'ultimo non e' una caratteristica del linguaggio).
Tu hai dimenticato tutti i difetti di Java e le migliorie di C# che ho scritto e riscritto fin'ora.-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 20:20:00.0 alle 2016-04-08 20:20:00.0Scritto da:
> (altra inconsistenza che apparentemente a te va benissimo [non si capisce infatti perché a te vada bene usare 4 == 4 anziché 4.equals(4) oppure 3 + 4 anziché 3.add(4) ma stranamente quando si tratta di stringhe fai tutte queste storie])
Perché un int è un value type e perciò il suo valore è il valore stesso, quindi è logico quanto segueint a = 2; int b = 2; a == b; //true
Invece una stringa è un reference type e quindi il suo valore è il puntatore, non il valore che invece si trova nell'indirizzo di memoria referenziato.
Quindi vale quanto seguePerson p1 = new Person("Andrea"); Person p2 = new Person("Andrea"); p1 == p2; //false
Infatti l'equivalente in C sarebbePerson* p1 = new Person("Andrea"); Person* p2 = new Person("Andrea"); p1 == p2; //false
Ed è assoluatmente vero, perché p1 e p2 non contengono lo stesso valore: sono due diversi indirizzi di memoria.
Ovviamente C#, a differenza di C, questi tecnicismi cerca un po' di nasconderli, ma poi a un certo punto devi comunque cominciare a capire anche in C# la differenza tra un valore e un puntatore, infatti...int main() { var person = new Person(); SetName(person); Console.WriteLine(person.Name); // "Andrea" } void SetName(Person person) { person.Name = "Andrea"; }
D'altra parte invece, se Person fosse una struct (tipo valore)int main() { var person = new Person(); SetName(person); Console.WriteLine(person.Name); ----> "" } void SetName(Person person) { person.Name = "Andrea"; }
In realtà l'affermazione "in java o C# non ci sono puntatori è una palla"... si bhe, è vero che sono reference type e non puntatori, ma si comportano allo stesso modo.
> che non mi obblighi a fracassarmi le mani per scrivere cose ovvie (come ad esempio che il tipo che sta a destra è lo stesso che sta a sinistra in un assegnamento
Avevo un collega che si incazzava quando il tipo di una variabile in C# non veniva dichiarato in maniera esplicita.
Si incazzava quando leggeva cose tipo...
var person = GetPerson(personId);
Perché diceva che in in un linguaggio OO tu DEVI sapere il tipo di una variabile quando leggi il codice.
La sua argomentazione sembrava sensata, finché non ho scoperto che in Visual Studio se posizioni il cursore sopra "var" ti viene indicato il tipo e d'altra parte anche se clicchi su "Go to definition".
-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 20:56:17.0 alle 2016-04-08 20:56:17.0Scritto da:
> Scritto da:
> > (altra inconsistenza che apparentemente a te va benissimo [non si capisce infatti perché a te vada bene usare 4 == 4 anziché 4.equals(4) oppure 3 + 4 anziché 3.add(4) ma stranamente quando si tratta di stringhe fai tutte queste storie])
>
> Perché un int è un value type e perciò il suo valore è il valore stesso, quindi è logico quanto segue
>
>> int a = 2; > int b = 2; > > a == b; //true > >
>
>
> Invece una stringa è un reference type e quindi il suo valore è il puntatore, non il valore che invece si trova nell'indirizzo di memoria referenziato.
>
> Quindi vale quanto segue
>
>> > Person p1 = new Person("Andrea"); > Person p2 = new Person("Andrea"); > > p1 == p2; //false > >
>
> Infatti l'equivalente in C sarebbe
>
>> > Person* p1 = new Person("Andrea"); > Person* p2 = new Person("Andrea"); > > p1 == p2; //false > >
>
> Ed è assoluatmente vero, perché p1 e p2 non contengono lo stesso valore: sono due diversi indirizzi di memoria.
>
> Ovviamente C#, a differenza di C, questi tecnicismi cerca un po' di nasconderli, ma poi a un certo punto devi comunque cominciare a capire anche in C# la differenza tra un valore e un puntatore, infatti...
>
>> > int main() > { > var person = new Person(); > SetName(person); > > Console.WriteLine(person.Name); // "Andrea" > } > > void SetName(Person person) > { > person.Name = "Andrea"; > } > > >
>
> D'altra parte invece, se Person fosse una struct (tipo valore)
>
>
>> > int main() > { > var person = new Person(); > SetName(person); > Console.WriteLine(person.Name); ----> "" > } > > void SetName(Person person) > { > person.Name = "Andrea"; > } > >
>
>
> In realtà l'affermazione "in java o C# non ci sono puntatori è una palla"... si bhe, è vero che sono reference type e non puntatori, ma si comportano allo stesso modo.
Non hai capito cosa ho contestato a Giambo.
Che int sia un tipo base e non un oggetto lo so, ma se accetti che ci siano delle eccezioni nel linguaggio semplicemente perché è più naturale scrivere 4 == 4 anziché 4.equals(4) allora puoi certamente anche accettare la stessa identica cosa quando compari le stringhe con == anziché con .equals perché è semplicemente più naturale fare così.
Le cose in Java diventano anche più complicate per via del fatto che oltre a int c'è anche Integer (la versione int boxata) con tanto di boxing e unboxing automatico.
Infatti puoi tanquillamente scrivereInteger x = 5; if (x == 5) .....
Che cazzo succede in questo caso?
Succede la cosa più NATURALE, non quella corretta (da un punto di vista OOP). La variabile x viene tradotta dietro le quinte temporaneamente in int, così == funziona.
Ma se invece haiInteger x = 5; Integer y = 5; if (x == y) ...
succede che invece stavolta x e y vengono trattati come oggetti e quindi hai un test di uguaglianza di istanza anziché di valore.
Quindi hai un'inconsistenza di comportamento non solo per come vengono trattati i tipi base rispetto alle stringhe (che è un tipo base in molti linguaggi) ma anche fra tipi numerici base e versioni boxate degli stessi.
La cosa peggiore è che per come funziona la creazione di oggetti in Java dietro le quinte il codice di cui sopra ti da "vero" in molti casi... creando bug di difficile comprensione che si presentano "ogni tanto" e non capisci perché se non sai che Java effettua il "caching" degli oggetti.
Quindi tu provi "a casa tua" il codice e funziona. Lo dai al cliente e quello ti telefona incazzato perché da lui quando piove e non è andato a messa la domenica prima il tuo programma non funziona.
Questo SI che crea confusione. Non certo l'overloading degli operatori usato in modo appropriato.
> > che non mi obblighi a fracassarmi le mani per scrivere cose ovvie (come ad esempio che il tipo che sta a destra è lo stesso che sta a sinistra in un assegnamento
>
> Avevo un collega che si incazzava quando il tipo di una variabile in C# non veniva dichiarato in maniera esplicita.
> Si incazzava quando leggeva cose tipo...
>
> var person = GetPerson(personId);
>
> Perché diceva che in in un linguaggio OO tu DEVI sapere il tipo di una variabile quando leggi il codice.
È un idiota. Affogalo in un po' d'acqua prima che decida di figliare.
> La sua argomentazione sembrava sensata,
Hitler è sembrato sensato a un sacco di tedeschi.
> finché non ho scoperto che in Visual Studio se posizioni il cursore sopra "var" ti viene indicato il tipo e d'altra parte anche se clicchi su "Go to definition".
L'argomentazione del tuo collega è ridicola. Quello che deve sapere il tipo non sei tu, è il compilatore.
Giusto per curiosità, il tuo collega che tipo darebbe a questa variabile?
var x = new {Nome = 'Pippo', Salario = 1050.25}
-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 21:45:16.0 alle 2016-04-08 21:45:16.0Scritto da:
> L'argomentazione del tuo collega è ridicola. Quello che deve sapere il tipo non sei tu, è il compilatore.
Anche te... perché quando vedi il tipo dici "Ah si, quel tipo figo che ha quel metodo figo!" e sai che cosa puoi fare e sai quel classe modificare se vuoi aggiungere qualcosa.
-
-
-
-
-
-
-
-
-
-
-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 09:47:40.0 alle 2016-04-08 09:47:40.0Scritto da:
> Java: stringa1.equals(stringa2)
> C#: stringa1 == stringa2
In realtà anche in C# sarebbe meglio usare il metodo string.Equals(string), perché esiste almeno un caso in cui ti salva.
http://stackoverflow.com/a/19102585/4367543
Comunque come fa notare Giambo java è più coerente con la filosofia OO, essendo una stringa un reference type e non un tipo valore.-
Re: La fine di Java su AndroidScritto da:
> Comunque come fa notare Giambo java è più coerente con la filosofia OO, essendo una stringa un reference type e non un tipo valore.
Grazie Sarru, anche se posti da anonimo perche' disprezzi il mio codice, te ne sono grato lo stesso
`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 10:00:26.0 alle 2016-04-08 10:00:26.0Scritto da: Giambo
> Scritto da:
>
> > Comunque come fa notare Giambo java è più coerente con la filosofia OO, essendo una stringa un reference type e non un tipo valore.
>
> Grazie Sarru
Fail.
-
-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 12:04:58.0 alle 2016-04-08 12:04:58.0Scritto da:
> Scritto da:
> > Java: stringa1.equals(stringa2)
> > C#: stringa1 == stringa2
>
> In realtà anche in C# sarebbe meglio usare il metodo string.Equals(string), perché esiste almeno un caso in cui ti salva.
>
> http://stackoverflow.com/a/19102585/4367543
Caso particolare che fra l'altro non mi è mai capitato. Nel 99.999999% dei casi == funziona senza alcun fastidio.
Usare Equals rende solo il codice più difficile da leggere in quasi tutti i casi... quindi usalo solo dove serve.
> Comunque come fa notare Giambo java è più coerente con la filosofia OO, essendo una stringa un reference type e non un tipo valore.
Della "filosofia OO" me ne frego. A me interessa che il codice sia chiaro da leggere e corto da scrivere. Meno scrivo e meno probabilità ci sono che faccio cazzate (e meno danni ai tendini mi faccio... ne sa qualcosa Sarru). Più il codice è chiaro da leggere e più facilmente riesco a riprendere dopo 2 mesi che non ci metto mano sopra.
Inoltre non è vero, perché si tratta semplicemente di una ridefinizione dell'operatore "==" dell'oggetto, quindi semmai è un'estensione della filosofia OO che risulta molto utile in molti casi e semplifica il codice... oltre a renderlo coerente con la comprazione fra stringhe vista praticamente in qualunque altro linguaggio.-
Re: La fine di Java su AndroidScritto da:
> Della "filosofia OO" me ne frego.
Ecco spiegato perche' non sei un buon programmatore.
`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 13:34:11.0 alle 2016-04-08 13:34:11.0Scritto da: Giambo
> Scritto da:
>
> > Della "filosofia OO" me ne frego.
>
> Ecco spiegato perche' non sei un buon programmatore.
>
Non lo è??-
Re: La fine di Java su AndroidScritto da:
> > > Della "filosofia OO" me ne frego.
> >
> > Ecco spiegato perche' non sei un buon programmatore.
>
> Non lo è??
Guadagna come me
?
`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 14:20:23.0 alle 2016-04-08 14:20:23.0Scritto da: Giambo
> Scritto da:
>
> > > > Della "filosofia OO" me ne frego.
> > >
> > > Ecco spiegato perche' non sei un buon programmatore.
> >
> > Non lo è??
>
> Guadagna come me
?
Non vive in Svizzera, ma in una regione dove la maggior parte della gente passa la maggior parte del tempo a bestemmiare in osteria
-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 14:38:22.0 alle 2016-04-08 14:38:22.0Scritto da:
> Scritto da: Giambo
> > Scritto da:
> >
> > > > > Della "filosofia OO" me ne frego.
> > > >
> > > > Ecco spiegato perche' non sei un buon programmatore.
> > >
> > > Non lo è??
> >
> > Guadagna come me
?
>
> Non vive in Svizzera, ma in una regione dove la maggior parte della gente passa la maggior parte del tempo a bestemmiare in osteria
È una feature, non un bug.-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 14:48:35.0 alle 2016-04-08 14:48:35.0Scritto da:
> Scritto da:
> > Scritto da: Giambo
> > > Scritto da:
> > >
> > > > > > Della "filosofia OO" me ne frego.
> > > > >
> > > > > Ecco spiegato perche' non sei un buon programmatore.
> > > >
> > > > Non lo è??
> > >
> > > Guadagna come me
?
> >
> > Non vive in Svizzera, ma in una regione dove la maggior parte della gente passa la maggior parte del tempo a bestemmiare in osteria
>
> È una feature, non un bug.
Però i committenti pagano meno perché metà del budget se ne va in vino.
-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 14:52:59.0 alle 2016-04-08 14:52:59.0Scritto da:
> Scritto da:
> > Scritto da:
> > > Scritto da: Giambo
> > > > Scritto da:
> > > >
> > > > > > > Della "filosofia OO" me ne frego.
> > > > > >
> > > > > > Ecco spiegato perche' non sei un buon programmatore.
> > > > >
> > > > > Non lo è??
> > > >
> > > > Guadagna come me
?
> > >
> > > Non vive in Svizzera, ma in una regione dove la maggior parte della gente passa la maggior parte del tempo a bestemmiare in osteria
> >
> > È una feature, non un bug.
>
> Però i committenti pagano meno perché metà del budget se ne va in vino.
Ogni vantaggio porta con sé un qualche svantaggio.-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 15:10:14.0 alle 2016-04-08 15:10:14.0Scritto da:
> Scritto da:
> > Scritto da:
> > > Scritto da:
> > > > Scritto da: Giambo
> > > > > Scritto da:
> > > > >
> > > > > > > > Della "filosofia OO" me ne frego.
> > > > > > >
> > > > > > > Ecco spiegato perche' non sei un buon programmatore.
> > > > > >
> > > > > > Non lo è??
> > > > >
> > > > > Guadagna come me
?
> > > >
> > > > Non vive in Svizzera, ma in una regione dove la maggior parte della gente passa la maggior parte del tempo a bestemmiare in osteria
> > >
> > > È una feature, non un bug.
> >
> > Però i committenti pagano meno perché metà del budget se ne va in vino.
>
> Ogni vantaggio porta con sé un qualche svantaggio.
Del resto il vino ce n'è anche che costa poco
-
-
-
-
Re: La fine di Java su AndroidScritto da:
> > > > > Della "filosofia OO" me ne frego.
> > > >
> > > > Ecco spiegato perche' non sei un buon programmatore.
> > >
> > > Non lo è??
> >
> > Guadagna come me
?
>
> Non vive in Svizzera, ma in una regione dove la maggior parte della gente passa la maggior parte del tempo a bestemmiare in osteria
Che schifo questi ceti sociali barbari
`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo
-
-
-
-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 13:56:28.0 alle 2016-04-08 13:56:28.0Scritto da: Giambo
> Scritto da:
>
> > Della "filosofia OO" me ne frego.
>
> Ecco spiegato perche' non sei un buon programmatore.
No, ecco perché TU sei una testa quadra.
Si deve SEMPRE preferire la chiarezza e la semplicità ad inutili formalismi. Sennò si finisce per scrivere codice di merda e difficile da capire.
L'OO è solo uno dei tanti strumenti che puoi usare. Fissarsi ad usarlo anche quando rende le cose più complicate del necessario è solo stupido... non ti fa vincere nessun premio.
Come ho già spiegato... il test sull'uguaglianza fra le istanze della classe String non è quasi mai quello che vuoi, né quello che ti aspetteresti. Ha quindi senso fare l'overloading dell'operatore "==" per rendere il codice più corto, più semplice da capire e più naturale. Cosa che fra l'altro è PREVISTA nella programmazione OO... quindi non è che stai usando cipolle invece di carote né stai "tradendo" un qualche principio scritto sul Corano... stai semplicemente usando lo strumenti giusto nel posto giusto.
-
Re: La fine di Java su AndroidScritto da:
> > > Della "filosofia OO" me ne frego.
> >
> > Ecco spiegato perche' non sei un buon programmatore.
>
> No, ecco perché TU sei una testa quadra.
> Si deve SEMPRE preferire la chiarezza e la semplicità ad inutili formalismi. Sennò si finisce per scrivere codice di merda e difficile da capire.
Il codice di merda, difficile da capire e da mantenere nasce da quelli che dicono che se ne fregano dell'OOP
> L'OO è solo uno dei tanti strumenti che puoi usare. Fissarsi ad usarlo anche quando rende le cose più complicate del necessario è solo stupido... non ti fa vincere nessun premio.
Se lavori con un linguaggio OOP, evitare di usarne gli strumenti messi a disposizione e' come usare il cacciavite per piantare chiodi.
`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 14:43:41.0 alle 2016-04-08 14:43:41.0Scritto da: Giambo
> Scritto da:
>
> > > > Della "filosofia OO" me ne frego.
> > >
> > > Ecco spiegato perche' non sei un buon programmatore.
> >
> > No, ecco perché TU sei una testa quadra.
> > Si deve SEMPRE preferire la chiarezza e la semplicità ad inutili formalismi. Sennò si finisce per scrivere codice di merda e difficile da capire.
>
> Il codice di merda, difficile da capire e da mantenere nasce da quelli che dicono che se ne fregano dell'OOP
Il problema infatti è proprio il linguaggio. Il fatto di volerti obbligare ad usare l'OO in ogni caso anche quando è tremendamente più semplice farne a meno azzoppa le tue possibilità e la tua capacità di scrivere codice chiaro. Vediti i video di Brian Will su youtube circa l'OOP (lui è un po' estremo e ritiene che TUTTO l'OOP faccia cagare, IMO non è così).
> > L'OO è solo uno dei tanti strumenti che puoi usare. Fissarsi ad usarlo anche quando rende le cose più complicate del necessario è solo stupido... non ti fa vincere nessun premio.
>
> Se lavori con un linguaggio OOP, evitare di usarne gli strumenti messi a disposizione e' come usare il cacciavite per piantare chiodi.
Guarda che quello che si sta rifiutando di usare l'operator overloading, previsto nella filosofia OO, sei proprio tu...
-
-
-
-
-
-
-
-
Re: La fine di Java su AndroidScritto da:
> https://apple.slashdot.org/story/16/04/07/2124257/...
>
> Dopo Microsoft che rende gratuito Xamarin con la possibilità di programmare in C# su Android, ora anche Google cerca un'alternativa a Java in Android Studio.
>
> </java>
Questa la mettiamo tra "La Svizzera collassera' fra 5 anni" e "L'E-Cat e' quasi pronto".
Assieme a "I musulmani ci conquisteranno tutti", la premonizione "Java e' alla frutta" rendono completo il quadretto di Wakko Frate Indovino
PS: Oddio, ma con Swift devo preoccuparmi delle referenze degli oggetti allocati ? Niente Garbage Collection
?!?
**Modificato dall'autore il 08.04.2016 09:33**`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo
-
Re: La fine di Java su AndroidNon ho voglia di rispondere alle wakkate per filo e per segno così apro un subthread apposta. Quando valuti un linguaggio non puoi fermarti alla sintassi, o a quello che offre di default, ma valutare l'ecosistema nella sua interezza.
Il punto di forza di Java è l'ecosistema di librerie, implementazioni, interoperabilità disponibile e le performances delle implementazioni della jvm, con i gc ottimizzati che altri runtime si sognano.
Java come linguaggio può morire anche domani, ma la jvm resisterà per molto tempo.Young professional woman and busy mom.-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-08 22:20:59.0 alle 2016-04-08 22:20:59.0Scritto da: ::1
> Non ho voglia di rispondere alle wakkate per filo e per segno così apro un subthread apposta. Quando valuti un linguaggio non puoi fermarti alla sintassi, o a quello che offre di default, ma valutare l'ecosistema nella sua interezza.
> Il punto di forza di Java è l'ecosistema di librerie, implementazioni, interoperabilità disponibile e le performances delle implementazioni della jvm, con i gc ottimizzati che altri runtime si sognano.
> Java come linguaggio può morire anche domani, ma la jvm resisterà per molto tempo.
Adesso sto giocando a Minecraft. Torno dopo o domani.
-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-09 01:53:12.0 alle 2016-04-09 01:53:12.0Scritto da: ::1
> Quando valuti un linguaggio non puoi fermarti alla sintassi, o a quello che offre di default, ma valutare l'ecosistema nella sua interezza.
Anche C# ha un buon ecosistema, sia per quanto riguarda le librerie che trovi che per quello che riguarda documentazione e supporto.
Ultimamente (almeno dal 2012) a Visual Studio è stato aggiunto NuGet che è un packet manager integrato nell'IDE/RAD dove puoi trovare migliaia di pacchetti (50'000 circa) che puoi installare nel tuo progetto con due click. https://www.nuget.org/packages
Avere un packet manager integrato nel tuo IDE/RAD, che poi è l'ambiente standard in cui si sviluppa roba C# (e VB.NET, ecc) è dannatamente comodo. Voglio Bootstrap per il mio sito? Clicco su "Strumenti"->"Gestione pacchetti" e cerco Bootstrap nel comodo menu. Lui si occupa di scaricarlo e di installarlo nelle cartelle corrette di modo che sia subito disponibile per il mio progetto. Ho bisogno dell'Entity Framework per accedere al database? Stessa cosa. Voglio AngularJS? Idem. JQuery? Stessa cosa. E così via.
Quando ho finito di lavorare sul mio sito ho varie opzioni per la pubblicazione... posso creare un "installer" per il sito... posso semplicemente pubblicarlo in una directory sul mio PC... posso caricarlo via FTP... posso inviarlo ad Azure... tutto da Visual Studio... senza alcun tool esterno con cui sbattermi.
Voglio vedere le tabelle del mio database? Visual Studio ha anche questo integrato.
Microsoft mi da gratis persino un loro repository online, anch'esso integrato in Visual Studio... che non è solo un repository, anche anche un "project management software" dove posso inserire i progressi, deadline, ecc. (onestamente io uso solo il repository quindi più di tanto sul resto non ti so dire)
Per quello che riguarda le librerie... ce n'è 50'000 solo su NuGet che risolvono svariati problemi... per il resto è pieno di esempi online su come fare questo o quello... raramente mi capita di imbattermi in un problema che una ricerca veloce su google non sia in grado di risolvermi.
Quindi no, non credo che Java sia così "speciale" da questo punto di vista. Forse ha più librerie, forse no, d'altra parte esiste da molto prima di .NET, sarebbe strano il contrario, ma il punto è che, fino ad ora, non c'è stato nulla che non potessi fare o con le librerie già rese disponibili dal framework .NET (che sono più complete di quelle rese disponibili nella JVM, vedi i vari esempi che ho fatto) o con una ricerca su NuGet. Quindi se mi dici "eh ma Java ha anche questa tal dei tali libreria" non so magari dirti se c'è qualcosa di equivalente per .NET, ma so dirti che fin'ora non mi è servita.
Quindi perché dovrei scegliere un linguaggio chiaramente vecchio e accrocchiato (dal fatto che si trascina dietro scelte discutibili passate [vedi i tipi base che non sono oggetti come tutto il resto, vedi il dover usare .equals invece di == per le stringhe, ecc]) come Java quando posso invece scegliere un linguaggio moderno, che mi risparmia fatica e pressione di tasti inutili e in più mi da accesso ad una comunità enorme, a migliaia di librerie, ecc?
> Il punto di forza di Java è l'ecosistema di librerie, implementazioni, interoperabilità disponibile e le performances delle implementazioni della jvm, con i gc ottimizzati che altri runtime si sognano.
Sulla jvm e il gc ottimizzato posso anche darti il beneficio del dubbio, ma onestamente non credo sia un problema così grosso come lo dipingi.
Prendi Voat.co... ha una MAREA di utenti... è sviluppato in C#https://github.com/voat/voat
ed è dannatamente responsivo. Tieni conto che i suoi autori non si aspettavano nulla dal sito, era solo un sito per imparare a programmare in C#/ASP.NET, quindi non è stato progettato con in mente l'idea di essere super-veloce, né di ospitare migliaia di utenti né è stato sviluppato da persone con un background in materia... eppure si comporta egregiamente.
Questo è un post di 9 mesi fa (quindi ora i numeri sono probabilmente più grossi) https://voat.co/v/voatdev/comments/114435..
. leggi la risposta di Atko
"In the last 30 days, voat had 154.327 unique visitors, 297.076 visits and 2.146.157 pageviews and things seem to be running with no major hiccups so far."
E tutto questo da un unico server Windows in cui "I've never seen it go above 30%".
Direi quindi che le performance del garbage collector e della VM di .NET sono più che buone.
> Java come linguaggio può morire anche domani, ma la jvm resisterà per molto tempo.
IMO la JVM è ancora legata a due mandate a Java. Sì, ci sono altri linguaggi che la usano, ma in che misura? Non credo si avvicinino nemmeno all'utilizzo da parte di Java. Se Java muore IMO anche la JVM muore... a meno che Oracle non decida di staccare la spina prima... magari quando Google passerà a Swift e Oracle non potrà più nemmeno sperare di succhiargli soldi. IMO Oracle quando ha comprato Java l'ha fatto più nella speranza di poter mungere Google che per altro.-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-09 02:46:39.0 alle 2016-04-09 02:46:39.0Scritto da:
> IMO Oracle quando ha comprato Java l'ha fatto più nella speranza di poter mungere Google che per altro.
Rettifica, Oracle non ha comprato Java... Oracle ha comprato SUN.
una probabile ragione per cui l'ha fatto è spiegata qui https://developers.slashdot.org/comments.pl?sid=89...
In pratica Oracle voleva poter produrre dei server suoi per poter competere con IBM e HP e SUN faceva proprio server. Java quindi era solo un bonus in più.
La cosa interessante è che Oracle ha comprato SUN, Java incluso, per 7 miliardi di dollari... e ora chiede a Google quasi 9 miliardi di dollari in danni solo perché Google ha reimplementato le API di Java (quindi Google non ha copiato proprio nulla, ha semplicemente riscritto la JVM).
https://developers.slashdot.org/story/16/03/28/213...
Perciò direi che se il tipo sopra ha ragione allora Oracle non ha mai avuto un vero interesse in Java, se non quello di derubare Google. Se Google abbandona Java è del tutto possibile che Oracle decida che Java per lei è solo un costo.
-
Re: La fine di Java su AndroidScritto da:
> nuget
Maven gestisce le librerie java dal 2002
> db dentro l'ide
dimmi qualcosa che eclipse non fa
> voat
twitter (scala), gmail, google documents
> > Java come linguaggio può morire anche domani, ma la jvm resisterà per molto tempo.
>
> IMO la JVM è ancora legata a due mandate a Java. Sì, ci sono altri linguaggi che la usano, ma in che misura? Non credo si avvicinino nemmeno all'utilizzo da parte di Java. Se Java muore IMO anche la JVM muore... a meno che Oracle non decida di staccare la spina prima... magari quando Google passerà a Swift e Oracle non potrà più nemmeno sperare di succhiargli soldi. IMO Oracle quando ha comprato Java l'ha fatto più nella speranza di poter mungere Google che per altro.
Della jvm ci sono varie implementazioni; tu conosci quella di oracle, ma sui server girano le openjdk su linux, le j9 di ibm e le jrockit di bea su aix/hpux.Young professional woman and busy mom.-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-09 13:17:08.0 alle 2016-04-09 13:17:08.0Scritto da: ::1
> Scritto da:
> > nuget
> Maven gestisce le librerie java dal 2002
>
> > db dentro l'ide
> dimmi qualcosa che eclipse non fa
>
> > voat
> twitter (scala), gmail, google documents
Hai mancato il punto di quello che ho scritto.
Il punto non è che Java non ha un packet manager, o un IDE, o persino un IDE con la possibilità di fare svarie cose utili, o tante librerie a disposizione...
Il punto è che anche C# con ASP.NET
ha queste cose.
Pertanto quando mi dici che non dovrei fermarmi al linguaggio ma valutare anche l'ambiente circostante... hai ragione... ma non vedo grossi incentivi da questo punto di vista per preferire la JVM a .NET
D'altro canto vedo che C# mi rende la vita molto più semplice in confronto a Java, vedo che C# mi permette di scrivere codice più pulito e più chiaro. E questo per me è un GROSSO incentivo.
> > > Java come linguaggio può morire anche domani, ma la jvm resisterà per molto tempo.
> >
> > IMO la JVM è ancora legata a due mandate a Java. Sì, ci sono altri linguaggi che la usano, ma in che misura? Non credo si avvicinino nemmeno all'utilizzo da parte di Java. Se Java muore IMO anche la JVM muore... a meno che Oracle non decida di staccare la spina prima... magari quando Google passerà a Swift e Oracle non potrà più nemmeno sperare di succhiargli soldi. IMO Oracle quando ha comprato Java l'ha fatto più nella speranza di poter mungere Google che per altro.
>
> Della jvm ci sono varie implementazioni; tu conosci quella di oracle, ma sui server girano le openjdk su linux, le j9 di ibm e le jrockit di bea su aix/hpux.
Tutta roba destinata a sparire nel momento in cui Oracle deciderà di volgere il suo sguardo a queste "implementazioni illegali" delle sue API.-
Re: La fine di Java su AndroidScritto da:
> Scritto da: ::1
> > Scritto da:
> > > nuget
> > Maven gestisce le librerie java dal 2002
> >
> > > db dentro l'ide
> > dimmi qualcosa che eclipse non fa
> >
> > > voat
> > twitter (scala), gmail, google documents
>
> Hai mancato il punto di quello che ho scritto.
> Il punto non è che Java non ha un packet manager, o un IDE, o persino un IDE con la possibilità di fare svarie cose utili, o tante librerie a disposizione...
>
> Il punto è che anche C# con ASP.NET
ha queste cose.
>
> Pertanto quando mi dici che non dovrei fermarmi al linguaggio ma valutare anche l'ambiente circostante... hai ragione... ma non vedo grossi incentivi da questo punto di vista per preferire la JVM a .NET
>
> D'altro canto vedo che C# mi rende la vita molto più semplice in confronto a Java, vedo che C# mi permette di scrivere codice più pulito e più chiaro. E questo per me è un GROSSO incentivo.
Continui ad avere il punto di vista dello sviluppatore, come se fosse l'unico a beneficiare della scelta di una piattaforma piuttosto che un'altra.
> > > > Java come linguaggio può morire anche domani, ma la jvm resisterà per molto tempo.
> > >
> > > IMO la JVM è ancora legata a due mandate a Java. Sì, ci sono altri linguaggi che la usano, ma in che misura? Non credo si avvicinino nemmeno all'utilizzo da parte di Java. Se Java muore IMO anche la JVM muore... a meno che Oracle non decida di staccare la spina prima... magari quando Google passerà a Swift e Oracle non potrà più nemmeno sperare di succhiargli soldi. IMO Oracle quando ha comprato Java l'ha fatto più nella speranza di poter mungere Google che per altro.
> >
> > Della jvm ci sono varie implementazioni; tu conosci quella di oracle, ma sui server girano le openjdk su linux, le j9 di ibm e le jrockit di bea su aix/hpux.
>
> Tutta roba destinata a sparire nel momento in cui Oracle deciderà di volgere il suo sguardo a queste "implementazioni illegali" delle sue API.
Roba fatta da aziende più grosse di oracle, che esiste e governa il mercato enterprise da 15 anni, non la tiri giù con una causa.Young professional woman and busy mom.-
Re: La fine di Java su AndroidScritto daNon Autenticatoil 2016-04-09 14:38:06.0 alle 2016-04-09 14:38:06.0Scritto da: ::1
> > Pertanto quando mi dici che non dovrei fermarmi al linguaggio ma valutare anche l'ambiente circostante... hai ragione... ma non vedo grossi incentivi da questo punto di vista per preferire la JVM a .NET
> >
> > D'altro canto vedo che C# mi rende la vita molto più semplice in confronto a Java, vedo che C# mi permette di scrivere codice più pulito e più chiaro. E questo per me è un GROSSO incentivo.
>
> Continui ad avere il punto di vista dello sviluppatore, come se fosse l'unico a beneficiare della scelta di una piattaforma piuttosto che un'altra.
D'altra parte sono io che devo scrivere il codice, sono io che mi becco la tendinite a scrivere codice ridondante, sono io che poi devo mantenere il codice, sono io quello che viene incolpato se qualcosa non funziona... direi che ho almeno il diritto di scegliere le tecnologie che ritengo più appropriate.
> > Tutta roba destinata a sparire nel momento in cui Oracle deciderà di volgere il suo sguardo a queste "implementazioni illegali" delle sue API.
>
> Roba fatta da aziende più grosse di oracle, che esiste e governa il mercato enterprise da 15 anni, non la tiri giù con una causa.
Mah, può essere, Google però mi sembra piuttosto grossa, eppure sono scoraggiati da Java e stanno cercando alternative.
Oracle d'altra parte ha già vinto la causa facendo passare il concetto che le API sono a tutti gli effetti coperte da copyright (il che è una stupidata, ma tant'è)... non so se un IBM a questo punto vorrà imbarcarsi nell'ennesima causa legale infinita con buone probabilità di fallire come ha fallito Google. Il fatto è che con la vittoria su Google Oracle si è messa in tasca anche il passepartout per tutta una serie di altre cause... verso chiunque reimplementi la JVM. A quel punto o pagano il pizzo ad Oracle oppure abbandonano la tecnologia e passano ad altro.
-
-
-
-
-
-