RISOLTO Java - primi passi

Stato
Discussione chiusa ad ulteriori risposte.

BAT

Moderatore
Staff Forum
Utente Èlite
22,948
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Per i primi esperimenti di lettura dell'input ti conviene definire una variabile di classe (cioè fuori dal corpo del main e degli altri metodi)
public static Scanner sc = new Scanner(System.in);
in questo modo hai un solo oggetto sc che può leggere qualunque cosa a seconda dei metodi che invochi;
potresti anche usare la classe Scanner nelle funzioni di lettura però è inefficiente perché ogni funzione ti crea ogni volta un nuovo oggetto per la lettura;
vedi il seg. esempio:

Java:
public class StringTest
{
    static Scanner sc = new Scanner(System.in); // creato una volta per tutte
   
    static int leggiIntVersioneBrutta(){
        System.out.println("Salve, sono una versione BRUTTA di lettura interi");
        System.out.println("Inserisci un intero e poi premi INVIO --> ");
        // inefficiente: crea un oggetto Scanner ogni volta che si vuol leggere un intero
        Scanner s = new Scanner(System.in);
        int ris = s.nextInt();
        return ris;
    }
   
    static int leggiInt(){
        System.out.println("Salve, sono una versione un po' meno brutta di lettura interi");
        System.out.println("Inserisci un intero e poi premi INVIO --> ");
        int ris = sc.nextInt(); // riferito alla variabile di classe
        return ris;
    }
   
    static String leggiStringa(){
        System.out.println("Salve, io leggo stringhe di caratteri");
        System.out.println("Inserisci una sola stringa e poi premi INVIO --> ");
        String ris = sc.next(); // riferito alla variabile di classe
        return ris;
    }
   
    public static void main(String[] args) {
        int u = leggiIntVersioneBrutta();
        System.out.println("u = " + u);
        int v = leggiInt();
        System.out.println("v = " + v);
        String str = leggiStringa();
        System.out.println("str = " + str);
    }
}
 
Ultima modifica:

petrusic

Utente Attivo
227
20
CPU
AMD Athlon - X86_64
Scheda Madre
Acer RS780HVF
HDD
SSD PLUS da 240GB (ospita 3 S.O Linux), WDC WD10EFRX-68F da 1000GB (ospita solo archivi dati)
RAM
n.2 DDR" per 2GB
OS
fedora 28 Mate, Ubuntu Mate, Linux Mint 19
Grazie a tutti. Ho capito.
Intanto vi comunico che anche il 2° programmino è arrivato al suo naturale traguardo.
Ho avuto una sorpresa inaspettata con l'istruzione switch per la sua sintassi, particolare rispetto alla select di altri linguaggi, ma ho risolto. Devo ancora abituarmi in tante peculiarità sintattiche di java, ma, grazie anche al vostro cortesissimo aiuto, ho potuto fare piccoli passi avanti nell'apprendimento.
 

pabloski

Utente Èlite
2,868
916
Devo ancora abituarmi in tante peculiarità sintattiche di java

Non temere, c'è gente che lo usa da anni e ancora non si è abituata. E comunque il peggio verrà più avanti. Onestamente Java come linguaggio è un'autentica rottura. Burocratico è il termine più preciso per definirlo. Il punto è che ha gazillioni di librerie in circolazione, che risolvono praticamente qualsiasi problema. Altrimenti credo che in molti l'avrebbero già buttato dalla finestra.
 

petrusic

Utente Attivo
227
20
CPU
AMD Athlon - X86_64
Scheda Madre
Acer RS780HVF
HDD
SSD PLUS da 240GB (ospita 3 S.O Linux), WDC WD10EFRX-68F da 1000GB (ospita solo archivi dati)
RAM
n.2 DDR" per 2GB
OS
fedora 28 Mate, Ubuntu Mate, Linux Mint 19
... Java ... ha gazillioni di librerie in circolazione, che risolvono praticamente qualsiasi problema. Altrimenti credo che in molti l'avrebbero già buttato dalla finestra.

Buttarlo via è quello che m'è venuto in mente stamattina quando ho letto che un array deve contenere elementi tutti dello stesso tipo, perchè quando si dichiara un array , in realtà, si dichiara una variabile di tipo array e, quindi, essendo una variabile, ha un suo tipo di dato univoco. Come se non bastasse, nella creazione di un array è obbligatorio assegnargli un numero di elementi definito.
Io sono abituato diversamente, infatti In Gambas esiste un tipo di dati denominato "variant" che permette di definire variabili e, quindi, anche array che possono ospitare qualsiasi tipo di dato e funziona perfettamente; inoltre un array può essere lasciato di lunghezza imprecisata "[] ", perciò ciascun nuovo elemento viene aggiunto in accodamento tramite il suffisso sintattico ".add".

Un esempio che può soddisfare le due caratteristiche appena citate può essere quello di dover caricare in memoria i record di un file che andrebbe riscritto ad un certo punto dell'elaborazione. É naturale, allora, che un record contenga tipi di dato non univoci, come pure è possibile che i record letti siano 10 e quelli da scrivere possano essere anche solamente 11. In Gambas posso benissimo caricare durante la lettura tutti i record in array bidimensionali di tipo variant in un array [] che va crescendo col numero di record letti ed aggiunti durante l'elaborazione seguente. E in Java?
siccome non posso credere che un caso del genere non sia gestibile in Java, sto cercando di scoprire come saltare il fosso.
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,948
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Gambas è una specie di basic (ORRORE!)... e tu vuoi paragonarlo a Java? cioè decine di milioni di programmatori al mondo sono stupidi!
Java ha indubbiamente dei difetti, tra cui una grossa verbosità, ma se vai in guerra non puoi usare una carriola al posto di un cacciabombardiere.
Quello che secondo te è un difetto invece è un pregio: tutti i linguaggi di programmazione seri associano un tipo (unico) agli elementi di un array e questo permette il controllo degli errori in compilazione.

Comunque se vuoi creare array con più tipi di dato, nulla di più "semplice":
Object[] arr = { "pippo", new BigInteger("5"), new BigDecimal("3.14"), null, new Object() };
C'è una stringa, un intero, un decimale, un riferimento nullo, infine un oggetto generico che più generico non si può;
ci infili quello che ti pare, con tutti gli errori che ne possono seguire. Ti piace? a me no.
In Java gli array sono ridimensionabili a piacere (anche run-time), non è necessario definire da subito una dimensione, le matrici possono essere frastagliate (cioè ogni riga con un numero diverso di elementi);
oppure puoi usare una classe chiamata ArrayList, in pratica un array ridimensionabile utilizzabile per una quantità enorme di compiti.
La vera difficoltà di Java è conoscere la sua sterminata libreria di classi, qualsiasi cosa tu voglia fare, stai sicuro che c'è una classe che la fa, e spesso è già inclusa nel linguaggio.
 

pabloski

Utente Èlite
2,868
916
un array deve contenere elementi tutti dello stesso tipo, perchè quando si dichiara un array , in realtà, si dichiara una variabile di tipo array e, quindi, essendo una variabile, ha un suo tipo di dato univoco. Come se non bastasse, nella creazione di un array è obbligatorio assegnargli un numero di elementi definito.

E' la scelta fatta da tutta la famiglia di linguaggi C-like. C++, Java, C# e tanti altri discendono dal C e ne ereditano alcuni assiomi. Uno di questi è la tipizzazione statica senza type inference, ragion per cui un array può contenere solo un certo tipo di dato. Sono linguaggi volutamente inflessibili, nella speranza di migliorare le possibilità per il programmatore di scrivere codice corretto. A volte ci riescono, a volte no.

La cosa interessante è che per sopperire alle evidenti mancanze di un simile modello, hanno dovuto inventarsi i generics ( meccanismo fondante, insieme alle eccezzioni del modello di programmazione di Java ).

L'array di dimensioni statiche è un'eredità diretta del C. E ci sono ragioni implementative del compilatore JIT della JVM per cui esistono ed esistono anche i tipi integrali ( int, long, ecc... ) che in altri linguaggi di altro livello non esistono come tipi integrali. Anche qui si è sopperito tramite un meccanismo apposito, la classe ArrayList citata da BAT00cent. E' pratica comune per questi linguaggi sopperire alle mancanze tramite la standard librabry ( pure C++ ha un array a dimensione dinamica implementato come classe della STL ).
 

petrusic

Utente Attivo
227
20
CPU
AMD Athlon - X86_64
Scheda Madre
Acer RS780HVF
HDD
SSD PLUS da 240GB (ospita 3 S.O Linux), WDC WD10EFRX-68F da 1000GB (ospita solo archivi dati)
RAM
n.2 DDR" per 2GB
OS
fedora 28 Mate, Ubuntu Mate, Linux Mint 19
Vedo che ho toccato la suscettibilità di Bat00cent. Mi dispiace, non era mia intenzione offendere nessuno nè tantomeno gli autori di Java, sicuramente un mostro fra i linguaggi di programmazione correnti, ma io, ripeto, non lo conosco e soprattutto posso sapere che esistano alternative di dichiarazioni appoggiate sulle sue librerie.
Da apprendista dell'ultima specie, posso immaginare soltanto la presenza di strumenti di programmazione di base, quegli strumenti che riesco a capire attraverso la lettura de documentazione di instradamento al linguaggio. Inoltre non era mia intenzione fare paragoni, perchè non ne ho nè le competenze opportune, nè le capacità. Ho solamente detto cosa riesco a fare nel mondo di programmazione che conosco.
Potrei soltanto aggiungere che, per effetto delle mie risorse personali, non so se continuerò a studiare java.
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,948
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Non è che hai urtato la mia sensibilità, ma se parli di cose che non conosci ti devo correggere per forza.
Ti ricordo che, quando eri alla ricerca di un linguaggio richiedevi esplicitamente:
- qualcosa che ti permettesse di scrivere codice una sola volta e farla funzionare su qualunque sistema operativo
- possibilità di costruire interfacce utente grafiche
Java è quanto ci si avvicina di più in un linguaggio tutto-in-uno, ma avevo anche chiarito da subito che è una via ripida.
Ci sono altri modi naturalmente, ma nessuno è facile o intuitivo altrimenti i programmatori nel mondo invece di essere decine di milioni sarebbero 3 miliardi o giù di lì...:varie13:
 
Ultima modifica:

pabloski

Utente Èlite
2,868
916
Potrei soltanto aggiungere che, per effetto delle mie risorse personali, non so se continuerò a studiare java.

A seconda degli obiettivi potrebbero interessarti:

  1. Google Go ( anche chiamato Golang sennò col cavolo che lo trovi su Google search )
  2. HaXe
  3. Haskell ( funzionale, un altro mondo rispetto ai linguaggi convenzionali )
  4. Rust
  5. Kotlin ( Java per esseri umani :D )
  6. Clojure ( un LISP, anche questi qui un altro mondo rispetto a i linguaggi tradizionali )
  7. Racket ( un altro LISP o meglio un'implementazione di Scheme )
  8. Javascript ( praticamente il più diffuso in assoluto, è come il prezzemolo )
  9. Python ( molto molto molto adatto ai novizi, estremamente espressivo e dotato di un supporto di librerie di terze parti da far impallidire pure Java )
  10. Nim ( poco diffuso, Pascal-like in buona parte, presenta idee interessanti )
  11. Red ( un clone di Rebol, decente supporto multipiattaforma )
Se vuoi restare sulla JVM potresti preferire Clojure. Sottolineo che i LISP a primo impatto sembrano usciti da un mondo alieno. Capito il giochino, si rivelano linguaggi dall'impressionante espressività, flessibilità e produttività. Non è un caso che tutti i linguaggi "moderni" pescano funzionalità da LISP.

Se si parla di GUI multipiattaforma, le soluzioni più avanzate sono: Qt ( supportato da Python, in parte Go, Javascript, Rust e Haskell ), Xamarin ( C# e VB.Net ), Sciter ( Go, Python, Rust ), JavaFX ( tutti i linguaggi JVM quindi anche Clojure e Kotlin ), Electron ( Javascript ).

Questi sono i maggiori. Ovviamente ce ne sono altri, non inclusi in quanto o troppo piccoli o incompleti o a pagamento. Ad esempio Lazarus è ottimo per gli sviluppatori Pascal, ma Pascal è ormai poco usato in ambito mainstream. Pharo è un altro progetto simile, uno Smalltalk ma comunque poco usato. Firemonkey è ottimo, usato con Delphi ( un discendente dell'Object Pascal ) ma pure questo è poco usato e anche a pagamento.

Imho Qt è nel tuo caso una buona scelta. E' stabile, ricco di funzionalità, ottima documentazione e può essere usato con tanti linguaggi, tra cui consiglio Python. Altri framework come Electron sono molto in voga e offrono tante funzionalità, ma hanno un'ecosistema che sembra Parigi durante la rivoluzione. Non è difficile incappare in librerie che nel giro di due settimane avranno perso popolarità, a favore di altre. Onestamente è un casino in cui solo giovinastri scapestrati possono trovarsi a loro agio :D

Racket e Red hanno loro gui e potrebbero essere una buona scelta. Clojure idem, inoltre si appoggia sulla JVM di Java e quindi puoi usare JavaFX e SWT.
 
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili