Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
be quiet! debutta nel settore mouse da gaming con Dark Perk Ergo e Dark Perk Sym: due modelli gemelli per specifiche, con polling rate di 8.000 Hz anche in wireless, sensore PixArt PAW3950 da 32.000 DPI e autonomia dichiarata fino a 110 ore. Nel test, a 8.000 Hz si arriva a circa 30 ore reali, con ricarica completa in un'ora e mezza
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker
Analizziamo nel dettaglio DJI RS 5, l'ultimo arrivato della famiglia Ronin progettato per videomaker solisti e piccoli studi. Tra tracciamento intelligente migliorato e ricarica ultra rapida, scopriamo come questo gimbal eleva la qualità delle produzioni.
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming
AMD Ryzen 7 9850X3D è la nuova CPU gaming di riferimento grazie alla 3D V-Cache di seconda generazione e frequenze fino a 5,6 GHz. Nei test offre prestazioni superiori a 9800X3D e 7800X3D, confermando la leadership AMD nel gaming su PC.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 18-04-2006, 23:21   #1
DarkSiDE
Senior Member
 
L'Avatar di DarkSiDE
 
Iscritto dal: Dec 2001
Città: Lecce
Messaggi: 3936
limitare il numero di instanze di una classe

è una domanda di teoria, non si riferisce ad un linguaggio specifico

se volessi limitare il numero delle istanze di una classe cosa mi converebbe fare?

vi sembra una 'buona' soluzione questa?

Codice:
public class MyClass {

private static int instanze=0;

MyClass(){
 if (instanze < numero)
   instanze++;
else throw new Exception();
}

}
__________________
Non farò mai più affari con khalhell, 4HwGenXX.

Ultima modifica di DarkSiDE : 18-04-2006 alle 23:24.
DarkSiDE è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2006, 00:13   #2
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Guarda.. al momento a me non viene in mente una soluzione definitiva anche se a primo impatto direi che bisognerebbe fare un giro nell'Heap e contare le istanze di questa classe di cui vuoi limitare le istanze. Nel senso: per ogni classe nell'Heap che equivale a MyClass incrementa il contatore... Per verificare se una classe è istanza di MyClass puoi usare istanceOf() oppure isInstance(Object obj) di Class.
Per esempio nella forma:
Codice:
if ( Class.forName ( classNameString ).isInstance ( myObject ) ) ...
oppure:
Codice:
Oggetto o = new Oggetto(); if (o instanceof MyClass) ...
Questo controllo nell'heap lo farei ogni volta prima di creare una nuova istanza di MyClass.. e se è stato raggiunto il numero massimo non la creo. Ora però non so se si possa fare questo "giro" nella memoria heap.

Onestamente penso che l'esempio da te riportato sia un po' scorretto. Intanto.. come fa ogni classe a incremetare un contatore "generale" se esso si trova all'interno della stessa?
Quel contatore non diventerà mai maggiore di 1, perchè ogni volta che si chiama il costruttore quello vede che la condizione nell'if è verificata e incrementa, e crea l'oggetto. Poi se ci sono altre invocazioni di quella classe/oggetto, verrà creato un nuovo contatore, anche se a dire il vero essendo statico potrebbe essere modificato da altre classi... ma a questo punto dovrebbe essere anche pubblica la variabile.. non so.. è un po' strano quello che hai scritto.. poi questo blocco:
Codice:
if (instanze < numero)
   instanze++;
else throw new Exception();
io lo metterei più in una classe chiamante (quella che creerebbe l'oggetto MyClass) piuttosto che nel costruttore della stessa...
Non so... contraddicimi pure.. nella confusione sono riuscito solo a fre queste deduzioni e ragionamenti che in parte saranno anche sbagliati.. spero ti aiutino a ragionarci su però.

EDIT: cmq... il fatto che java impedisca di accedere alla memoria penso che inibisca anche la possibilità di vedere quali e quante istanze ci siano in memoria di una certa classe. L'unico sistema è contarle ogni volta che vengono invocate. Per esempio:
variabile statica come contatore; allo scatenarsi di un evento (non so pressione di un pulsante per esempio) verifico il contatore, se esso è inferiore a un certo valore, creo un nuovo oggetto e incremento il contatore, altrimenti lancio eccezione.

ciaoo!
__________________
^ThE CyBoRg^

Ultima modifica di fbcyborg : 19-04-2006 alle 00:35.
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2006, 00:49   #3
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Il codice di DarkSide non fa una grinza (salvo un throws Exception omesso nel costruttore).

Poichè non tutti le lingue che usano costruttori stabiliscono che i costruttori restituiscano istanze (uno di quelli che non lo fa è proprio Java), opterei per un pattern factory (qualcuno diverso da MyClass genera istanze di MyClass), anche per poter decidere la politica di intervento in caso di raggiungimento del limite. Tanto per lasciare la porta aperta perchè l'uso dell'eccezione è in sè, scusa il gioco di parole, ineccepibile.

Io non mi incartapecorirei nella memoria della JVM, cosa pure possibile a partire da Java 5 con JMX.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2006, 08:43   #4
BountyKiller
Utente sospeso
 
Iscritto dal: Oct 2002
Messaggi: 2156
i dati membro statici vanno inizializzati al di fuori della classe con l'operatore di risoluzione di scope altrimenti non servono a niente
__________________
sign editata dallo staff
BountyKiller è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2006, 09:40   #5
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da BountyKiller
i dati membro statici vanno inizializzati al di fuori della classe con l'operatore di risoluzione di scope altrimenti non servono a niente
E dove sta scritto!??
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2006, 09:54   #6
Mixmar
Senior Member
 
L'Avatar di Mixmar
 
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
Credo che basti estendere (modificare) correttamente questo pattern.
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur
Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N
Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN
Mixmar è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2006, 09:57   #7
Galotar
Utente sospeso
 
L'Avatar di Galotar
 
Iscritto dal: Jul 2002
Città: Ostia/Roma
Messaggi: 1191
Quote:
Originariamente inviato da DarkSiDE
è una domanda di teoria, non si riferisce ad un linguaggio specifico

se volessi limitare il numero delle istanze di una classe cosa mi converebbe fare?

vi sembra una 'buona' soluzione questa?

Codice:
public class MyClass {

private static int instanze=0;

MyClass(){
 if (instanze < numero)
   instanze++;
else throw new Exception();
}

}
Non vorrei dire una cacchiata ma cosi facendo ti ritroveresti ad avere n classi "MyClass" con l'intero "istanze" settato a 1.
__________________
Codice:
Ho concluso affari con : 8310(1,2),luxo,weather65,gokou,Zara,LotharInt,Mammabell,cionci,omerook,nathbigga,V0r[T3X],FatMas,3N20,smickys,CICUS,Dreamland,morpheus89,AMDman,Andi89,drive97,mich25,killerbox,abc3d,Sclergio,saint80,mazä,MR_GINO,OdinEidolon,ezekiel22
Galotar è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2006, 10:00   #8
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Quote:
Originariamente inviato da Galotar
Non vorrei dire una cacchiata ma cosi facendo ti ritroveresti ad avere n classi "MyClass" con l'intero "istanze" settato a 1.
Appunto! è quello che pensavo anche io!
come fa a "non fare una grinza" ?
Quote:
Originariamente inviato da fbcyborg
[...]
Quel contatore non diventerà mai maggiore di 1, perchè ogni volta che si chiama il costruttore [...]
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2006, 10:37   #9
Angus
Senior Member
 
L'Avatar di Angus
 
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
Quote:
Originariamente inviato da DarkSiDE
è una domanda di teoria, non si riferisce ad un linguaggio specifico

se volessi limitare il numero delle istanze di una classe cosa mi converebbe fare?

vi sembra una 'buona' soluzione questa?

Codice:
public class MyClass {

private static int instanze=0;

MyClass(){
 if (instanze < numero)
   instanze++;
else throw new Exception();
}

}
Il tuo codice può anche andare bene, a patto che tu intenda limitare il numero di istanze costruite. Se invece intendi limitare il numero di istanze contemporaneamente esistenti in un dato istante ti conviene pensare al concetto di pooling. Esistono tanti modi per metterlo in pratica, ad esempio se sovrascrivessi nella tua classe il metodo:

Codice:
public void finalize() throws Throwable {
    istanze--;
}
Il grosso difetto del tuo codice è che non è thread-safe: e se ti stai chiedendo "che me ne frega del thread-safe?" allora perchè non delegare all'unico thread che utilizza MyClass il controllo sul numero di istanze?

Un esempio di pooling lo trovi qui .
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer
°SetiEmperor°| Ninja Technologies
{ qualunque cosa sia, è veloce e fa male (cit.) }
Angus è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2006, 11:18   #10
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da DarkSiDE
è una domanda di teoria, non si riferisce ad un linguaggio specifico

se volessi limitare il numero delle istanze di una classe cosa mi converebbe fare?

vi sembra una 'buona' soluzione questa?

Codice:
public class MyClass {

private static int instanze=0;

MyClass(){
 if (instanze < numero)
   instanze++;
else throw new Exception();
}

}

La soluzione migliore dipende fortemente da quello che vuoi fare. Spesso e volentieri la soluzione migliore e' non limitare il numero di istanze, oppure passi attraverso un Factory method e rendi il costruttore privato.

Che cosa devi fare di preciso? Devi limitare ad una sola istanza? Devi avere non piu' di un certo numero di istanze vive e riciclarle?
fek è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2006, 11:30   #11
DarkSiDE
Senior Member
 
L'Avatar di DarkSiDE
 
Iscritto dal: Dec 2001
Città: Lecce
Messaggi: 3936
raga, attenzione eh:
Quote:
Originariamente inviato da DarkSiDE
è una domanda di teoria, non si riferisce ad un linguaggio specifico
__________________
Non farò mai più affari con khalhell, 4HwGenXX.
DarkSiDE è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2006, 12:26   #12
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da DarkSiDE
raga, attenzione eh:
Allora l'unica risposta e': dipende.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2006, 13:48   #13
BountyKiller
Utente sospeso
 
Iscritto dal: Oct 2002
Messaggi: 2156
Quote:
Originariamente inviato da andbin
E dove sta scritto!??
da qualche parte nella mia mente ma se ci pensi un attimo penso che potrai convenire con me.... il problema di andare a inizializzare un membro statico dentro alla classe che lo possiede è il fatto che tutte le istanze di quella classe fanno quell'inizializzazione e così perdi la "memoria " del membro statico......attenzione che ho scritto inizializzare......se una classe modifica (attenzione: modifica, con un incremento prefisso se il membro è un numero intero,ad esempio) un suo dato membro statico non posso dire a priori che sia sbagliato.......
__________________
sign editata dallo staff
BountyKiller è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2006, 13:50   #14
DarkSiDE
Senior Member
 
L'Avatar di DarkSiDE
 
Iscritto dal: Dec 2001
Città: Lecce
Messaggi: 3936
Quote:
Originariamente inviato da fek
Allora l'unica risposta e': dipende.
è una domanda 'generica', una risposta 'generica' va bene
__________________
Non farò mai più affari con khalhell, 4HwGenXX.
DarkSiDE è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2006, 13:53   #15
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Insisto col factory .

Vuoi creare degli oggetti, affidi il compito a qualcuno e poichè quel qualcuno li crea può anche contare quanti ne abbia creati. Che io sappia non c'è un linguaggio sedicente orientato agli oggetti che impedisca la definizione di un produttore di altri oggetti. Devo però ammettere di conoscere solo alcuni linguaggi di programmazione e non tutti: magari qualcuno esclude la possibilità di usare il pattern factory.

OT: Le variabili di classe sono create e inizializzate una sola volta, all'atto della preparazione della classe o interfaccia (JLS, 3a ed., 4.12.3, 12.3.2)
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2006, 17:14   #16
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
In effetti non funziona in quel modo.
Ogni oggetto MyClass in quel modo ha il suo intero "instanze", che ovviamente sarà sempre fisso ad 1.
Si dovrebbe risolvere mettendo fuori dalla classe la variabile in modo che per qualsiasi oggetto MyClass vede quella.
Quindi mettere MyClass dentro un'altra classe.. sbaglio? se si, dove?
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2006, 17:16   #17
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Quote:
Originariamente inviato da PGI-Bis

OT: Le variabili di classe sono create e inizializzate una sola volta, all'atto della preparazione della classe o interfaccia (JLS, 3a ed., 4.12.3, 12.3.2)
Quindi quello che ho scritto su è sbagliato??
Ahhh! comincio a fare confusione..
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2006, 18:01   #18
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Usciamo dal seminato perchè la domanda è "in generale" ma visto che c'è la curiosità di saperlo...

Se "istanze" è una variabile di classe, allora esiste una sola variabile "istanze" per l'unica MyClass, per ogni ClassLoader.

Lasciando da parte i ClassLoader, tutte le istanze di MyClass (ma non solo) condividono la stessa variabile "istanze". Le operazioni che un'istanza di MyClass conduca su quella variabile "istanze" saranno visibili ad ogni altra istanza di MyClass.

A scanso d'equivoci, questo non vuol dire che in Java le informazioni si condividano tra oggetti così (o necessariamente così). E' di gran lunga più comune che la condivisione sia mediata da un terzo oggetto, noto ad entrambi i condividenti. Esiste però anche questa possibilità in forza della quale ogni classe Java è potenzialmente un singleton.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 20-04-2006, 10:00   #19
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Quote:
Originariamente inviato da PGI-Bis
Usciamo dal seminato perchè la domanda è "in generale" ma visto che c'è la curiosità di saperlo...

Se "istanze" è una variabile di classe, allora esiste una sola variabile "istanze" per l'unica MyClass, per ogni ClassLoader.

Lasciando da parte i ClassLoader, tutte le istanze di MyClass (ma non solo) condividono la stessa variabile "istanze". Le operazioni che un'istanza di MyClass conduca su quella variabile "istanze" saranno visibili ad ogni altra istanza di MyClass.

A scanso d'equivoci, questo non vuol dire che in Java le informazioni si condividano tra oggetti così (o necessariamente così). E' di gran lunga più comune che la condivisione sia mediata da un terzo oggetto, noto ad entrambi i condividenti. Esiste però anche questa possibilità in forza della quale ogni classe Java è potenzialmente un singleton.

Quindi in poche parole il codice di darkside in linea generale è esatto..
perchè ogni oggetto MyClass creato incrementerà di 1 "instanze" fino ad arrivare a "numero" e quindi al prossimo tentativo di creazione di un oggetto MyClass avremo indietro l'eccezione.. no?
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 20-04-2006, 10:17   #20
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
E in effetti provando funziona...

Codice:
import poo.inout.*;

public class Test{
	private static int istanze=0;
	private boolean esisto;
	public Test(boolean esisto){
		if(istanze<4){
			this.esisto=esisto;
			istanze++;
		}else{
			System.out.println("STOP, TROPPE ISTANZE");
			System.exit(-1);
		}
	}

	public static void main(String args[]){
		int n=Console.readInt("Quante istanze? ");
		Test vettore[]=new Test[n];
		for(int i=0; i<n; i++){
			vettore[i]=new Test(true);
		}
		System.out.println("OK");
	}


}
nb: poo.inout è una libreria per leggere da console... vedi: Console.readInt().

Risultati:

Codice:
Quante istanze?  3
OK
Premere un tasto per continuare . . .
Codice:
Quante istanze?  4
OK
Premere un tasto per continuare . . .
Codice:
Quante istanze?  5
STOP, TROPPE ISTANZE
Premere un tasto per continuare . . . . .
__________________

Ultima modifica di luxorl : 20-04-2006 alle 10:21.
luxorl è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequen...
Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Pornhub e altri siti porno si ribellano ...
La TV non è smart? Amazon la trasforma c...
Oltre 200 siti di news hanno limitato l'...
Gennaio si chiude positivamente per il m...
Caos in Ubisoft: licenziato un dipendent...
BMW ed Encory avviano il riciclo diretto...
La società privata russa Space En...
HyperOS 3: al via l'ultima fase del rila...
Allarme Notepad++: compromesso per sei m...
LIGO-Virgo-KAGRA: nuovo studio sulle ond...
Usare il traffico urbano come motore per...
Sony brevetta un controller PlayStation ...
Firefox aggiunge il 'kill switch' per el...
TV OLED 2026 e Odyssey G6: Samsung abbra...
Stranger Things: Storie dal 1985 debutta...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 12:50.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v