|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Sep 2005
Messaggi: 37
|
[java] reference
Ciao,
vorrei implementare un metodo che mi ritorna un boolean, che mi indica se un oggetto non è stato ancora refererenziato, come potrei fare? grazie |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
non sono sicuro di aver capito...cmq ci provo:
Codice:
public boolean isNull(Object o) { return o == null; } ![]()
__________________
![]() |
![]() |
![]() |
![]() |
#3 |
Messaggi: n/a
|
un oggetto (o meglio un reference, cioè una cosa che punta all'oggetto in sè) non referenziato è
Object x; con x in questo stato non ci puoi fare proprio niente, il compilatore di darà sempre e comunque errore. un reference così Object x=null; è un reference che sì punta a qualcosa, a null. |
![]() |
![]() |
#4 |
Member
Iscritto dal: Sep 2005
Messaggi: 37
|
mi spiego meglio:
Invece di chiedermi se object x==null, mi chiedevo se era possibile implementare un metodo che mi faccia la stessa cosa ma senza usare "==null" . ![]() |
![]() |
![]() |
![]() |
#5 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
possiamo sapere a cosa ti serve? per realizzare il codice scritto da TigerShark "== null" va usato per forza, poco ma sicuro...
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
Codice:
public boolean ciStaDentro(Object o) { try { o.hashCode(); return true; } catch (NullPointerException ex) { return false; } } ![]()
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } |
![]() |
![]() |
![]() |
#7 | |
Messaggi: n/a
|
Quote:
![]() |
|
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
La tua richiesta mi ha acceso un dubbio
![]() Tutto sommato e' piuttosto semplice controllare se il tuo oggetto e' uguale a null, per cui ho l'impressione che la tua richiesta sia qualcosa di diverso. Sbaglio? High Flying Sottovento |
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Sep 2005
Messaggi: 37
|
sono un programmatore alle prime armi,siccome mi e' stato contestato in un progetto il fatto di controllare se un "oggetto è == null" e' proprio quello che voglio,penso il tuo metodo vada bene, probabilmente io voglio il contrario:
Codice:
public boolean isEmpty(Object o) { try { o.hashCode(); return false; } catch (NullPointerException ex) { return true; } } |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Se ti va, potresti pubblicare il pezzo di codice contestato.
Scusa il mio intervento, ma mi sembra strano che ti obiettino di verificare se stai lavorando con dei dati corretti. Generalmente contestano il fatto che questi controlli non ci siano..... Magari il tuo codice e' particolare. Se vuoi, per scrupolo, possiamo darci un'occhiata.... High Flying Sottovento |
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Sep 2005
Messaggi: 37
|
certo, ecco qua il codice contestato, il puto critico e' rappresentato dal
"while (mret==null)".. Codice:
package com.officina; import java.util.ArrayList; public class Officina { private ArrayList operai; private ParcoMacchine macchineRiparate; private CassettaAttrezzi cassettaAttrezzi; private ArrayList macchineDaRiparare; public Officina(CassettaAttrezzi cassettaAttrezzi, ParcoMacchine macchineRiparate){ this.cassettaAttrezzi = cassettaAttrezzi; this.operai = new ArrayList(); this.macchineDaRiparare = new ArrayList(); this.macchineRiparate = macchineRiparate; } public void avviaLavori(){ for(int i = 0; i < operai.size(); i++){ if (operai.get(i) instanceof Operaio) { Operaio operaio = (Operaio) operai.get(i); operaio.start(); } } } public CassettaAttrezzi prendiCassettaAttrezzi(){ return cassettaAttrezzi; } public void aggiungiMeccanico(Operaio operaio){ operai.add(operaio); } public synchronized void riponiMacchinaRiparata(Macchina macchina){ macchineRiparate.aggiungiMacchina(macchina); } public synchronized void parcheggiaMacchinaDaRiparare(Macchina macchina) throws InterruptedException { macchineDaRiparare.add(macchina); notifyAll(); } public synchronized Macchina prendiMacchinaDaRiparare() throws InterruptedException { Macchina mRet = null; Object objTmp = null; while(mRet == null){ // punto critico!!!!!!!!!!!!!! if (macchineDaRiparare.size() != 0){ objTmp = macchineDaRiparare.remove(0); if (objTmp instanceof Macchina) { mRet = (Macchina) objTmp; } } else wait(); } return mRet; } } grazie 1000 sottovento.. mi piacerebbe imparare molto da gente come te.. |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Ciao,
grazie per gli immeritati complimenti, ma non credo di poter insegnare niente. Ho controllato il codice che hai postato, e mi sembra in ordine (purtroppo nella pubblicazione si e' persa l'indentazione originale, immagino. Comunque e' comprensibile). Da quello che ho capito, questa funzione ritorna la prima macchina disponibile alla riparazione. Nel caso non ci siano, si addormenta ed aspetta che ne arrivino. Come effetto collaterale, svuota la pila che contiene la lista delle macchine da riparare e, forse, altre cose... Beh, se e' questo quanto ti era richiesto di fare, direi che allora ci siamo. Se non era questo, puo' darsi che io abbia capito male o analizzato male il codice. Ad ogni modo non vedo grossi problemi. La curiosita' aumenta: ti hanno contestato il fatto che usi un confronto a null? per quale motivo? Piccola domanda: spesso nelle aziende che usano Java, hanno del personale che proviene dal C e ogni tanto "mischiano" i linguaggi, visto che sono tanto simili. E' il caso di chi ha mosso la contestazione? High Flying Sottovento |
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
Quote:
Codice:
public synchronized Macchina prendiMacchinaDaRiparare() { while(macchineDaRiparare.size() == 0) { // punto critico!!!!!!!!!!!!!! } return (Macchina) macchineDaRiparare.remove(0); }
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } Ultima modifica di Angus : 06-03-2006 alle 15:09. |
|
![]() |
![]() |
![]() |
#14 | |
Member
Iscritto dal: Oct 1999
Messaggi: 111
|
Quote:
il ciclo non viene comunque eseguito una sola volta? |
|
![]() |
![]() |
![]() |
#15 |
Member
Iscritto dal: Sep 2005
Messaggi: 37
|
esatto, finche non ci sono macchine da riparare continua a cercare nella lista macchine, quando la trova ritorna la macchina da riparare.. il motivo della contestazione non lo so, ho solo il punto di codice segnato in rosso dal mio prof!(sono uno studente).. dici che posso utilizzare la funzione che mi hai suggerito ( al contrario) per modificare il codice e fare sparire il null?
![]() |
![]() |
![]() |
![]() |
#16 |
Member
Iscritto dal: Sep 2005
Messaggi: 37
|
ah ecco forse ci sono, devo utilizzare un "while (true)" e mi risolvo tutti i problemi...
Codice:
public synchronized Macchina prendiMacchinaDaRiparare() throws InterruptedException { while(true){ if (macchineDaRiparare.size() != 0){ return (Macchina) macchineDaRiparare.remove(0); } else wait(); } } Ultima modifica di raniero : 06-03-2006 alle 15:52. |
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Ho un nuovo indizio, ora: hai un professore, e non un direttore tecnico, a cui rispondere. In tal caso, i programmi sono di dimensioni piu' corte ma vengono controllati in maniera piu' approfondita. E' quindi probabile che quel punto di domanda sia stato messo perche' il codice, anche se e' corretto, contiene delle parti inutili (diciamo evitabili) come, appunto, quel controllo. Si puo' in effetti riscrivere l'algoritmo (vedo che l'hai gia' fatto) e renderlo piu' snello. Forse era questo che il prof. intendeva. Piu' semplicemente, invece che un ciclo infinito, potresti scrivere: while (macchineDaRiparare.size() != 0) { // ... } (detto fra noi: generalmente io scrivo while (macchineDaRiparare.size() > 0) perche' la condizione piu' forte e' sempre la piu' sicura, ed e' una buona abitudine da prendere. Ovviamente stai facendo un esame, quindi devi entrare nella testa di chi ti sta davanti, prima ancora che pensare a queste cose. Magari non gli piace e ti riempie di segni rossi....) High Flying Sottovento |
|
![]() |
![]() |
![]() |
#18 |
Member
Iscritto dal: Oct 1999
Messaggi: 111
|
Ecco...
Prima durante il primo ciclo di while arrivava al return e indipendentemente dal valore presente (null oppure diverso da null) restituiva il valore (ovviamente per questo motivo il ciclo veniva eseguito un'unica volta). adesso invece aspetta che effettivamente ottieni un oggetto e quindi restituisce un valore valido. Ma a questo punto potresti tagliare la testa al toro con Codice:
public synchronized Macchina prendiMacchinaDaRiparare() throws InterruptedException { while(macchineDaRiparare.size() == 0)){ wait(); } return (Macchina) macchineDaRiparare.remove(0); } altrimenti il codice potrebbe essere semplicemente Codice:
public synchronized Macchina prendiMacchinaDaRiparare() throws InterruptedException { if (macchineDaRiparare.size() == 0)) wait(); return (Macchina) macchineDaRiparare.remove(0); } in questo modo se la lista è vuota il codice viene bloccato fino al primo notify(). Quando viene sbloccato siccome il codice è nella clausola syncrhonized dovresti essere sicuro che c'è qualcosa nella lista. Ultima modifica di crick_pitomba : 06-03-2006 alle 16:15. |
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
Quote:
edit: alla prima lettura mi era sfuggito il notifyAll().
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } Ultima modifica di Angus : 06-03-2006 alle 16:21. |
|
![]() |
![]() |
![]() |
#20 |
Member
Iscritto dal: Sep 2005
Messaggi: 37
|
grazie 1000 per le dritte.. quindi suppongo che te sei un programmatore professionista, e che hai un direttore tecnico pignolo!
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:47.