Problemi con i package

di il
7 risposte

Problemi con i package

PREMESSA: sono alle prime armi con la OOP.
Mi è chiaro che è possibile importare tutte le classi di un package utilizzando la direttiva: import root.package.*;
Non mi è chiaro come sia possibile far riferimento ad una classe mediante l'utilizzo del "nome completo" del suo Package.

Mi spiego meglio: ho creato sul desktop una cartella : mioPackage con la sottocartella: classeAuto ed in questa sottocartella ho creato il .java della classe Auto , con prima riga : package mioPackage.classeAuto;
Dopodiché, NON nella stessa cartella , ho creato la mia mainClass ovvero:

public class AutoTest{
public static void main(String args[])
{
classeAuto.Auto panda= new classeAuto.Auto();
}
}

Tuttavia, al momento della compilazione,il compilatore mi dice che: non esiste alcun package classeAuto.
Ho provato a settare il CLASSPATH come: .;C:\Users\PC\Desktop\mioPackage\classeAuto , ma la compilazione della mainClass mi dà lo stesso errore

DUBBIO: ho notato che invece tutto funziona con un codice che utilizza un package già presente nella cartella di installazione java
// Stampa la data corrente
class prova{
public static void main(String args[])
{
System.out.println(new java.util.Date());
}
}
Mi chiedo: è possibile effettivamente utilizzare una classe di un package che NON sia quello della cartella: java nella root : src SENZA doverla per forza IMPORTARE ??

7 Risposte

  • Re: Problemi con i package

    pepp1995 ha scritto:


    Non mi è chiaro come sia possibile far riferimento ad una classe mediante l'utilizzo del "nome completo" del suo Package.
    Basta mettere nel sorgente il nome completamente qualificato di un tipo, ovviamente in tutti i punti dove lo si usa.

    Es. invece di fare:

    import java.util.Random;

    tecnicamente si può fare:

    java.util.Random rnd = new java.util.Random();

    Quindi il tipo Random è completamente qualificato nel tipo della variabile e nel riferimento al costruttore. E così sarebbe ovunque nel sorgente.

    pepp1995 ha scritto:


    Ho provato a settare il CLASSPATH come: .;C:\Users\PC\Desktop\mioPackage\classeAuto
    Nel classpath NON ci vanno i nomi di package ma solo le directory "base", ovvero quelle che contengono i package "radice".

    Se il .class (il compilato) l'hai fatto andare nella stessa directory del .java (scenario basilare se non si sceglie un'altra destinazione per i class), allora lo avrai in:

    C:\Users\PC\Desktop\mioPackage\classeAuto\Auto.class

    Se hai messo all'inizio package mioPackage.classeAuto; allora:

    a) in CLASSPATH va messo C:\Users\PC\Desktop (NON C:\Users\PC\Desktop\mioPackage, NON C:\Users\PC\Desktop\mioPackage\classeAuto)

    b) nella classe AutoTest o fai:

    import mioPackage.classeAuto.Auto;
    o in generale
    import mioPackage.classeAuto.*;

    e poi usi solo Auto

    ... oppure usi OVUNQUE il nome qualificato: mioPackage.classeAuto.Auto

    pepp1995 ha scritto:


    è possibile effettivamente utilizzare una classe di un package che NON sia quello della cartella: java nella root : src SENZA doverla per forza IMPORTARE ??
    La domanda non è molto chiara. Ma in generale: o importi un tipo .... o usi il nome completamente qualificato del tipo ovunque.

    E i tipi nel package di "default" non si possono importare, perché chiaramente non ha un nome.
  • Re: Problemi con i package

    Grazie mille !!
    Sei stato davvero fondamentale su più punti

    Tuttavia, ho un ultimo dubbio (forse banale):
    1) nel caso in cui utilizzo la direttiva di import (ad es. import java.util.*;) ,nel .class della mia mainClass sarà automaticamente incorporato il codice di "tutte" le classi del package indicato?
    Viceversa,
    2) nel caso in cui decida di evitare l'utilizzo di import e di limitarmi a specificare il nome completo del package , nel .class non verrà incorporato anche il codice della classe che sta in quel package, ma il compilatore si limiterà a far riferimento ad un .class già esistente . Corretto?
  • Re: Problemi con i package

    pepp1995 ha scritto:


    1) nel caso in cui utilizzo la direttiva di import (ad es. import java.util.*;) ,nel .class della mia mainClass sarà automaticamente incorporato il codice di "tutte" le classi del package indicato?
    No, la direttiva import NON fa nulla di "attivo", non carica/incorpora nulla di per sè. Vuol solo dire al compilatore: guarda, se nel sorgente trovi un nome semplice di un tipo es. Random, puoi andare a guardare se lo trovi in java.util.

    pepp1995 ha scritto:


    2) nel caso in cui decida di evitare l'utilizzo di import e di limitarmi a specificare il nome completo del package , nel .class non verrà incorporato anche il codice della classe che sta in quel package, ma il compilatore si limiterà a far riferimento ad un .class già esistente . Corretto?
    Questo di seguito vale in generale: in un file .class c'è il bytecode solo per una classe, non c'è nulla di "incorporato" da altre classi (a parte le costanti a "tempo di compilazione" di tipo primitivo/String che hanno un trattamento particolare).
  • Re: Problemi con i package

    Ottimo!
    Quindi sia che si ragioni nel modo 1) sia che si ragioni nel modo 2) , in entrambi i casi sto solo "suggerendo" al compilatore dove trovare il Tipo "Complesso" da utilizzare.

    Credo mi sia tutto cristallino =)
    Ri-grazie mille e scusa per il disturbo.
  • Re: Problemi con i package

    pepp1995 ha scritto:


    Ottimo!
    Quindi sia che si ragioni nel modo 1) sia che si ragioni nel modo 2) , in entrambi i casi sto solo "suggerendo" al compilatore dove trovare il Tipo "Complesso" da utilizzare.
    Sì perché poi nel .class i riferimenti ai tipi sono TUTTI completamente qualificati, perché questo è quello che serve alla JVM.
  • Re: Problemi con i package

    Scusami se riapro il topic ma ho ancora un dubbio.
    In pratica, negli appunti del corso java seguito , mi si ripete più volte che : "una valida alternativa al dover settare il CLASSPATH è: lo specificare il package assumendo come radice il disco C".
    Ho cercato di dare un senso a quanto su citato creandomi un esempio ad-hoc. Nello specifico :
    - ho eliminato il classpath settato
    - ho creato sul desktop la solita cartella mioPackage con sottocartella classeAuto contenente Auto.java
    indicando come 1° riga:
    package C.Users.PC.Desktop.mioPackage.classeAuto;
    -ho creato la mia mainClass in un'altra certa cartella , ovvero un file AutoTest.java
    indicando come 1°riga:
    import C.Users.PC.Desktop.mioPackage.classeAuto.*;

    Problema: il package non viene rilevato (e dunque la compilazione del file AutoTest.java non va a buon fine)

    Mi chiedo: è davvero possibile importare un package partendo da C.Users.PC ,tuttavia
    - SENZA settare il CLASSPATH
    - SENZA dare comandi da cmd che non siano javac e java (rispettivamente per la compilazione ed esecuzione del codice) ?
  • Re: Problemi con i package

    pepp1995 ha scritto:


    "una valida alternativa al dover settare il CLASSPATH è: lo specificare il package assumendo come radice il disco C".
    Detto così, non vuol dire nulla di utile/sensato ....

    pepp1995 ha scritto:


    Ho cercato di dare un senso a quanto su citato creandomi un esempio ad-hoc. Nello specifico :
    - ho eliminato il classpath settato
    - ho creato sul desktop la solita cartella mioPackage con sottocartella classeAuto contenente Auto.java
    indicando come 1° riga:
    package C.Users.PC.Desktop.mioPackage.classeAuto;
    -ho creato la mia mainClass in un'altra certa cartella , ovvero un file AutoTest.java
    indicando come 1°riga:
    import C.Users.PC.Desktop.mioPackage.classeAuto.*;
    No.

    Se in un sorgente metti es.
    package com.esempio;
    
    public class Prova { ......... }
    Allora il file .class DEVE poi trovarsi in un percorso così:

    com\esempio\Prova.class

    Perché la regola fondamentale è che i nomi dei package si devono SEMPRE "riflettere" nella struttura delle cartelle (questo vale sia nel file-system, sia in un file .jar).

    Dove sta materialmente la directory "com" NON ha importanza.

    Se il percorso assoluto fosse:

    C:\Esempi\com\esempio\Prova.class
    allora C:\Esempi deve essere listato in classpath.

    Se fosse:

    C:\Users\Utente\Desktop\com\esempio\Prova.class
    allora C:\Users\Utente\Desktop deve essere in classpath.

    Poi nel classpath ci può essere un path assoluto o relativo. Se è relativo, lo è rispetto alla directory corrente.

    Se da prompt faccio
    cd C:\Users\Utente\Desktop

    sono già lì, quindi basterebbe anche solo set CLASSPATH=.

    "." = directory corrente.
Devi accedere o registrarti per scrivere nel forum
7 risposte