|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Oct 2005
Messaggi: 258
|
[Java] Variabili "globali"
Salve a tutti,
volevo sapere come si fa in Java a definire delle variabili in modo da poterle usare in tutte le classi di uno stesso package. Ho provato a dichiararle public o protected in una classe ma le altre classi non le vedono. Altra domanda: Se ho una classe A che istanzia una classe B, può creare problemi se nella definizione di B metto che estende A? Grazie |
![]() |
![]() |
![]() |
#2 |
Registered User
Iscritto dal: Jul 2007
Messaggi: 915
|
In java non esistono "variabili globali". La cosa piu' simile che puoi fare è creare una classe di sole variabili "public static" e poi fai un import static nelle altre classi (si, è contorto)
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2774
|
Per la prima domanda, parli di variabili d'istanza o statiche?
protected dovrebbe essere il modificatore corretto, ma forse per quello che devi fare tu devi aggiungere anche static. Dipende da cosa vuoi fare, non si è capito bene. http://java.sun.com/docs/books/tutor...sscontrol.html Per la seconda domanda non sono sicuro ma credo di no |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
E poi non avrebbe molto senso logicamente (se B è una estensione di A com'è che A necessita di B per eseguire il suo lavoro? Significherebbe che la stessa B avrebbe bisogno di se stessa per poter fare quello per cui è stata progettata) Ciao
__________________
GPU Compiler Engineer |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2774
|
Quote:
![]() Ad ogni modo, al di là del senso logico le istanze di A e B sono comunque delle entità distinte, quindi perché A non dovrebbe poter istanziare B? |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Si fa' cosi':
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
![]() |
![]() |
![]() |
#7 | |
Member
Iscritto dal: Oct 2005
Messaggi: 258
|
Quote:
che io sappia poi in Java una classe importa di default tutte le altre classi dello stesso package... Comuqnue ho definito come static ste variabili ma nelle altre classi non le riconosce. Qualche altro consiglio? ![]() |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2774
|
Posta il codice così vediamo
PS: usa il tag CODE |
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Oct 2005
Messaggi: 258
|
Allora, cerco di spiegare un pò meglio:
premetto che questo è il mio primo programma in Java quindi perdonatemi se dico o ho fatto qualche sfondone. Io devo realizzare un sistema client/server dove il server può gestire più connessioni assegnando a ognuna di esse un thread dedicato. Il problema nasce proprio però quando la classe CollabServer chiama il costruttore di CollabHandler(che è la classe che dovrebbe far partire il thread per gestire la connessione). Quando ciò avviene si verifica una IOException e CollabHandler non parte. Notate che CollabServer estende thread mentre CollabHandler estende CollabServer proprio per poter usufruire di alcune variabili in comune. Ecco il codice delle 2 classi: CollaServer Codice:
package serverclientprova; import java.net.*; import java.io.*; import java.util.*; public class CollabServer extends Thread { //-------------------------------------------------- protected FilmInProg [] vFiP; protected String info = ""; protected MessageInputStream mis; protected MessageOutputStream mos; protected BufferedReader bis; protected BufferedWriter bos; protected int nM; public CollabServer() throws IOException { MemorizzaFile(); nM = ContaMatrici(); vFiP = new FilmInProg [nM]; CreaVettore(); ServerSocket server = new ServerSocket(1414); System.out.println ("Accepting connections..."); while(true) { Socket client = server.accept(); //ogni richiesta di connessione viene accettata System.out.println ("Accepted from " + client.getInetAddress()); try{ new CollabHandler(client).start(); /////QUI E' IL PROBLEMA//////// }catch(IOException e){ System.out.println("IO Exception" + "\n"); }//Istanziamo un oggetto CollabHandler per gestire la connessione } } } public void MemorizzaFile () throws IOException { try{ bis = new BufferedReader(new InputStreamReader(new FileInputStream("DbCinema.txt"))); //apriamo il file di testo contenente le info String temp = ""; while( (temp = bis.readLine()) != null) info = info + temp + "\n"; } catch(IOException e){ System.out.println("IO Exception" + "\n"); } finally { try { bis.close(); } catch (IOException e) { System.out.println("IO Exception" + "\n"); } } } public int ContaMatrici () throws IOException { //conta il numero delle matrici che dovranno esser create String inputLine = ""; int num = 0; try { bis = new BufferedReader(new InputStreamReader(new FileInputStream("DbCinema.txt"))); //apriamo il file di testo contenente le info inputLine = bis.readLine(); while (inputLine.compareTo("FINE") != 0) { bis.readLine(); inputLine = bis.readLine(); while (inputLine.compareTo("---") != 0) { num++; inputLine = bis.readLine(); } inputLine = bis.readLine(); } } catch (IOException e) { System.out.println("IO Exception" + "\n"); } finally { try { bis.close(); } catch (IOException e) { System.out.println("IO Exception" + "\n"); } } return num; } public void CreaVettore () throws IOException { String NomeF, NomeS, t; int i = 0; try{ bis = new BufferedReader(new InputStreamReader(new FileInputStream("DbCinema.txt"))); NomeF = bis.readLine(); while (NomeF.compareTo("FINE") != 0){ NomeS = bis.readLine(); t = bis.readLine(); while (t.compareTo("---") != 0){ vFiP[i] = new FilmInProg( NomeF, NomeS, t); i++; t = bis.readLine(); } NomeF = bis.readLine(); } }catch (IOException e) { System.out.println("IO Exception" + "\n"); }finally{ try { bis.close(); } catch (IOException e) { System.out.println("IO Exception" + "\n"); } } } //-------------------------------------------------- public static void main(String args[]) throws IOException { new CollabServer(); } } Codice:
package serverclientprova; import java.net.*; import java.io.*; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; public class CollabHandler extends CollabServer { protected Socket socket; // protected MessageInputStream mis; // protected MessageOutputStream mos; protected ObjectInputStream ois; protected ObjectOutputStream oos; //-------------------------------------------------- public CollabHandler(Socket socket) throws IOException { this.socket = socket; try{ mis = new MessageInputStream(socket.getInputStream()); mos = new MessageOutputStream(socket.getOutputStream()); ois = new ObjectInputStream(socket.getInputStream()); oos = new ObjectOutputStream(socket.getOutputStream()); }catch (IOException e) { System.out.println("IO Exception" + "\n"); } } public void run () { try{ while(true){ System.out.println("QUI CI ARRIVA"); mis.receive(); try{ Thread.sleep(1000); }catch (InterruptedException ex) {} String cmd = mis.readUTF(); if (cmd.equals ("Richiedi")) Richiedi(); else if (cmd.equals ("PostiLiberi")){ mis.receive(); String Sala = mis.readUTF(); String Orario = mis.readUTF(); PostiLiberi(Sala, Orario); } else if (cmd.equals ("Compra")) Compra(); } } catch (ClassNotFoundException ex) { Logger.getLogger(CollabHandler.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex){ ex.printStackTrace(); } } . . . . Ultima modifica di Pompolus : 06-02-2008 alle 21:42. |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Se proprio vuoi renderle visibili solamente a classi nello stesso package (e vale anche per la classe che le contiene), allora devono avere livello di accesso di "default" (package level), cioè non va specificato un modificatore di accesso. Poi le metti static. Quindi: Codice:
class Globali { static int a; static String b; }
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#11 | |
Member
Iscritto dal: Oct 2005
Messaggi: 258
|
Quote:
ho provato a fare come dici tu ma non riesco a far funzionare. Io ho creato all'interno del package una classe chiamata "Globali" e il codice da te scritto. Ma nelle altre classi dello stesso package, nè a nè b vengono riconosciute. Devo fare qualche import o roba del genere? Ah io uso NetBean, non so se può essere utile ^^ |
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Il prossimo che consiglia ad un principiante di imparare prima il C gli linko questo topic.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Scusa, ma CollabHandler estende CollabServer.
Questo significa che CollabHandler è CollabServer. Che bisogno hai di creare una CollabServer e poi da dentro chiamare una CollabHandler se la CollabHandler fa già il proprio lavoro e allo stesso tempo anche quello della CollabServer (essendo essa stessa una CollabServer visto che la estende) ?. Usa direttamente la CollabHandler Ciao
__________________
GPU Compiler Engineer |
![]() |
![]() |
![]() |
#14 |
Member
Iscritto dal: Oct 2005
Messaggi: 258
|
comunque il mio problema resta che la chiamata "new CollabHandler(client).start();" non funziona.
L'unica cosa che ho pensato da cui possa dipendere è il fatto che estende CollabServer e CollabServer estende Thread e che quindi possa dare una qualche sorta di conflitto. Per questo ho pensato di usare delle variabili "globali" e quindi poter evitare di far estendere CollabServer, ma non sono neanche sicuro che possa essere una soluzione. Non so proprio perchè non parte : \ |
![]() |
![]() |
![]() |
#15 | |
Member
Iscritto dal: Oct 2005
Messaggi: 258
|
Quote:
Allora ripeto questo è il mio primo programma quindi sto andando un pò a casaccio... Io devo creare un thread per ogni connessione che il server accetta, per questo istanzio un collabhandler per ogni connessione. Solo che collabhandler utilizzerà delle variabili contenute in collabserver ed è SOLO per questo motivo che collabhandler estende collabserver. Lo so che non è elegante ma è l'unico modo che sono riuscito a trovare per far vedere quelle cazzo di variabili ad entrambe le classi senza doverle passare in tutti i metodi (improponibile). |
|
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
![]() Prova, vedrai che finisci prima che tentando di costringere Java a fare quello che non vuole fare (le variabili globali).
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Devi pensare ad oggetti. Che cos'è (che oggetto è) la CollabServer? Immagino sia l'idealizzazione di un "Server". La CollabHandler cos'è? E' l'idealizzazione di un thread che gestisce la connessione immagino. Bene. Quello che hai fatto tu è questo: "La CollabServer è un Server che estende un Thread, mentre la CollabHandler è un gestore di connessione che estende un Server che estende un Thread. 1° - Che bisogno ha il Server di essere un Thread. Perchè hai fatto CollabServer extends Thread? Non ce n'è bisogno, visto che il server non deve essere un thread, ma solo un server. Invece ad essere un Thread dovrebbe essere CollabHandler. 2° - Perchè CollabHandler è un Server? Che bisogno ha CollabHandler di essere un server? Nessuno. Quindi in sostanza inizia a rifare il progetto partendo da questo suggerimento : class CollabServer { // Codice qua } e class CollabHandler extends Thread { // Codice qua } Ciao
__________________
GPU Compiler Engineer |
|
![]() |
![]() |
![]() |
#18 |
Member
Iscritto dal: Oct 2005
Messaggi: 258
|
Ok, ho eliminato il problema delle variabili globali (Ora CollabServer le passa a CollabHandler), inoltre CollabHandler ora estende Thread (non esetende più CollabServer) e CollabServer non estende più nulla...
Però continua a non funzionare. Posto il codice di CollabHandler dove si blocca: Codice:
package serverclientprova; import java.net.*; import java.io.*; import java.util.*; // import prominence.msg.*; ????? import java.util.logging.Level; import java.util.logging.Logger; public class CollabHandler extends Thread { protected Socket socket; protected MessageInputStream mis; protected MessageOutputStream mos; protected ObjectInputStream ois; protected ObjectOutputStream oos; protected int nM; protected String info; protected FilmInProg [] vFiP; //-------------------------------------------------- public CollabHandler(Socket socket, String info, int nM, FilmInProg [] vFiP) throws IOException { this.socket = socket; this.info = info; this.nM = nM; this.vFiP = vFiP.clone(); try{ mis = new MessageInputStream(socket.getInputStream()); mos = new MessageOutputStream(socket.getOutputStream()); }catch (IOException e) { System.out.println("IO Exception" + "\n"); } try{ ois = new ObjectInputStream(socket.getInputStream());//Qui è il problema, questa istruzione non viene eseguita e si blocca, perchè? oos = new ObjectOutputStream(socket.getOutputStream()); }catch (IOException e) { System.out.println("IO Exception" + "\n"); } start(); } . . . . Grazie ancora dell'aiuto Ultima modifica di Pompolus : 06-02-2008 alle 22:42. |
![]() |
![]() |
![]() |
#19 |
Member
Iscritto dal: Oct 2005
Messaggi: 258
|
già finiti i consigli?
![]() |
![]() |
![]() |
![]() |
#20 |
Member
Iscritto dal: Oct 2005
Messaggi: 258
|
Raga mi sta venendo un dubbio atroce...
Io devo passare un vettore di oggetti da client a server e viceversa. Ho usato un ObjectInputStream e un ObjectOutputStream ma mi danno un casino di errori. Qualcuno può postarmi il codice funzionante? Ecco come ho fatto io: Lato server: Codice:
ois = new ObjectInputStream(socket.getInputStream()); oos = new ObjectOutputStream(socket.getOutputStream()); Codice:
Ois = new ObjectInputStream (i); Oos = new ObjectOutputStream (o); Vi prego aiutatemi che sto in alto mare ![]() ![]() ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:44.