Package (sono un principiante)

di il
6 risposte

Package (sono un principiante)

Salve, scusate se vi scrivo in modo inesatto ma mi sto avvicinando alla programmazione a quasi mezzo secolo di vita e dire che sono inesperto è dire poco. Mi hanno consigliato l'uso di un IDE che si chiama Geany per cominciare, in quanto è semplice e snello. Il mio problema è capire dove sbaglio nell'uso “didattico” dei package

Allora sul desktop di winwds ho creato una cartella "esercizi" con dentro altre due sottocartelle denominate "A" e "B" con dentro in A un file che si chiama A.java e in B un file che si chiama B.java.

Il codice dice di B.java è:

package B;
public class B{
 
}


quello di A.java è

package A;
import B;

public class A{

 public int public_f;
 int default_f;
 private int private_f;
 
 void foo (A a, B b){
 
 }
 
}

 compilando mi dice che in A.java ho errore sul tipo B nei parametri passati al metodo foo... suppongo perchè importo male il package B, ma non riesco a risolvere, qualcuno può aiutarmi? Grazie.

6 Risposte

  • Re: Package (sono un principiante)

    Domande di rito, avendo “mezzo secolo” ;-)

    1. perche' lo fai?
    2. perche' hai scelto Java?

    .

    Questo perche' ci sono linguaggi di programmazione alternativi, ALTRETTANTO espressivi, MA PIU' SEMPLICI da usare.

    Ovvio, niente e' “a gratis”, ci sono pro e contro, MA POICHE' ci sono pro e contro in TUTTI i casi, conviene scegliere il caso in cui i pro sono di piu' ;-)

    ---

    Java: l'uso di un IDE e' cosa buona e giusta MA conviene PRIMA avere PERFETTAMENTE CHIARO come le cose si scrivono in Java.

    Dalla domanda che fai e' evidente che non ti sono chiari FONDAMENTALI concetti sulla struttura dei package e delle directory.

    – Package --

    Il discorso e' abbastanza complicato. La versione SEMPLICE e' questa

    1. DEVE ESISTERE una directory RADICE (in genere si chiama ‘src’ o ‘source’) DENTRO LA QUALE TUTTI i sorgenti Java DEVONO STARE
    2. ESISTE UNA RELAZIONE 1:1 TRA il package JAVA e IL PATH RELATIVO (rispetto alla radice) in cui il file si trova il sorgente Java. 
    3. ESISTE UNA RELAZIONE 1: TRA il nome della classe ED IL NOME DEL sorgente Java

    .

    Il nome del sorgente Java DEVE ESSERE ESATTAMENTE UGUALE AL NOME DELLA CLASSE

    Il nome del package DEVE ESSERE ESATTAMENTE UGUALE AL PATH RELATIVO rispetto la ROOT. 

    Piu' precisamente, SE il file “MiaClasse.java” (CONTENENTE la classe “MiaClasse”) si trova nella directory con path RELATIVO rispetto alla ROOT

    dove/sta/la/mia/classe

    il package DEVE ESSERE

    dove.sta.la.mia.classe

    cioe' DEVE ESSERE POSSIBLE passare da package a path relativo SEMPLICEMENTE CAMBIANDO ‘.’ con ‘/’

    Queste regole NON SONO OPZIONALI, MA SONO OBBLIGATORIE.

    – Importazione --

    Anche qui' le regole sono abbastanza ‘complicate’:

    1. le classi IN ALTRI PACKAGE vanno SEMPRE IMPORTATE usando il NOME COMPLETO, cioe' il nome del package PIU' il nome della classe. Ci sono casi speciali ma per ora lasciamo perdere
    2. NON SI IMPORTANO le classi presenti NELLO STESSO PACKAGE (cioe' nella stessa directory) in cui si trova la classe corrente. C'e' una specie di “importazione automatica”. Anche qui ci sono casi speciali ma lasciamo perdere

    Quindi se sei nel package

    io.sono.qui  (che corrispode al path relativo “io/sono/qui”)

    e vuoi importare la classe “MiaClasse' che si trova nella directory ”dove/sta/la/mia/classe" dovrai scrivere

    import dove.sta.la.mia.classe.MiaClasse;

    ---

    Ci sono una serie di “”macelli"" quando la classe si trova ESATTAMENTE nella directory ROOT.

    Diciamo, per tagliare la testa al toro (e per fortuna tagliano quello e non qualcosa altro ;-)), che 

    NON CONVIENE MAI AVERE classi nella ROOT.

    .

    Sembra che semplifichi la vita, MA lo fa SOLO nei primi 5 minuti!

    All'istante 5 minuti ed 1 millisecondo, diventa un “macello”.

    ---

    Nel caso in questione, dovresiti avere

    import B.B

    poiche' la classe B SI DEVE TROVARE NELLA directory B

    mentre la classe A SI DEVE TROVARE NELLA DIRECTORY A

    ---

    Comunque sono TUTTE COSE che trovi su QUALUNQUE TESTO su Java.
    Sono concetti FONDAMENTALI descritti NEI PRIMI CAPITOLI.

    Come noti dalla lunghezza della risposta, NON E' UNA COSA BANALE.

    Ti conviene STUDIARE BENE usando LIBRI e non andando a tentoni o usando Internet.

    Al limite prova con ChatGPT ;-)

  • Re: Package (sono un principiante)

    Salve, grazie della sua risposta. Scelto java per curiosità e un po' perchè ho trovato un libro in biblioteca che sto leggendo “concetti di informatica e fondamenti di java”, non con semplicità, ma ci si prova. Probabilmente il mio errore è nell'avere confusione di questa classe “src” di cui lei scrive: banalmente avevo pensato che creando una cartella sul desktop con dentro dopo sottocartelle cm avevo scritto, e facendo l'import (avevo provato anche "import B.B;" ma non funziona) potesse andare bene. Penso di non aver chiaro io il funzionamento del path, se questo deve essere settato in qualche modo o che.

    Cmq grazie della sua spiegazione e dei consigli

  • Re: Package (sono un principiante)

    Ho risolto grazie, e tramite internet. Come pensavo non era un discorso di sintassi la mia, ma di percorso e di parametri da passare a javac
    Ero convinto che in qualche modo il compilatore vedesse in automatico le sottocartelle come possibili package analizzando il codice, ma così non è, bisogna indicargli in qualche modo quale è la classe radice. Ho risolto col comando “javac -cp . A\A.java” lasciando l' "import B.B;" come avevo provato inizialmente.

    Credo che oltre ai libri, internet, forum, guide ecc siano una grande risorsa.

    Saluti.

  • Re: Package (sono un principiante)

    Devi stare piu' attento a quello che leggi (oppure a quello che scrivi) ;-)

    “src” NON E' una classe MA UNA DIRECTORY.

    Ci ho messo un po' a scrivere la risposta in modo che ci fossero TUTTE le informazioni (o almeno quelle FONDAMENTALI OBBLIGATORIE)

    ---

    Se lo fai per hobby, direi che Java NON E' una buona scelta.

    E' preferibile Python, per tutta una serie di motivi:

    1. e' interpretato, quindi puoi eseguire il tutto senza la compilazione
    2. puoi fare ANCHE programmazione ad oggetti e non ha nulla da invidiare a Java come espressivita'
    3. e' infinitamente piu' semplice, perche' e' un linguaggio NON TIPATO (che ha pregi e diffetti)
    4. c'e una community sterminata che ha creato un'insieme STERMINATO di funzionalita' aggiuntive
    5. puoi andare da scrivere “2+2” ad usarlo per implementare algorithmi di Intelligenza Artificiale O Videogiochi

    Ha una sintassi un po' strana (io ci ho messo un po' a digerirla ;-) ) MA non complicata.

    Ci puoi fare programmazione procedurale, funzionale, ad oggetti, meta-programmazione, …
    Ci fai applicazione desktop, web, ..

    Il mondo del Machine Learning (di cui ChatGPT fa parte) e' basato al 90% su Python.

    Insomma, c'e' ne' per ogni palato ;-)

    PS: per quelli che pensano che conoscendo Python possono trovare lavoro in ambito Machine Learning.

    Mettetevi il cuore in pace: NO! 

    Conoscere Python NON BASTA, anzi non serve a nulla perche' uno che non lo conosce lo impara in una settimana, ad essere lenti. 

    Serve TUTTO IL RESTO!

  • Re: Package (sono un principiante)

    Ottimo, grazie della sua disponibilità e consigli.

  • Re: Package (sono un principiante)

    Un ultimo consiglio… nei titoli del forum inseris i solo un riferimento tecnico conciso al problema, il resto non serve 

Devi accedere o registrarti per scrivere nel forum
6 risposte