Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
ASUS Expertbook PM3: il notebook robusto per le aziende
ASUS Expertbook PM3: il notebook robusto per le aziende
Pensato per le necessità del pubblico d'azienda, ASUS Expertbook PM3 abbina uno chassis particolrmente robusto ad un pannello da 16 pollici di diagonale che avantaggia la produttività personale. Sotto la scocca troviamo un processore AMD Ryzen AI 7 350, che grazie alla certificazione Copilot+ PC permette di sfruttare al meglio l'accelerazione degli ambiti di intelligenza artificiale
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-01-2011, 17:53   #1
blackskop
Senior Member
 
Iscritto dal: Aug 2008
Messaggi: 308
[JAVA] costruttori e metodi set incrociati

Oggi sono incappato in questo problema:

Ho due classi A e B che inizialmente avevano i costruttori che prendevano come parametro il tipo dell'altra

Codice:
public A(B istanza) { }

public B(A istanza) { }
volendole utilizzare in una terza classe capite subito che sarebbe impossibile.
Allora ho pensato di sostituire i costruttori con dei metodi set.

Codice:
public class B { public void set(A istanza) { } }

public class A { public void set(B istanza) { } }
Questo mi risolve il problema iniziale ma ne introduce un altro:
ammettiamo che le due classi abbiano un altro metodo "execute" che al suo interno utilizza l'istanza dell'altra classe

Codice:
public class B {
    private A istanza;

    public void set(A istanza) { this.istanza = istanza; }

    public void execute() { istanza.test(); }
}
se io istanzio la classe B senza settare la classe A, nel momento in cui invoco execute di B viene sollevata una NullPointerException. Per ovviare potrei fare dei controlli all'interno di "execute" del tipo

Codice:
    public void execute() {
        if (istanza != null) istanza.test();
    }
ma se la classe B contenesse 2456 metodi set per altrettante classi, gestire la cosa con una serie di if mi sembrerebbe un obbrobrio (mi viene da pensare all'eventuale ridondanza degli if stessi da utilizzare in diversi metodi). A questo punto vi chiedo come posso forzare il programmatore ad usare i metodi set prima di invocare un qualsiasi altro metodo della classe? Il costruttore mi da esattamente questo ma c'è il problema dei riferimenti incrociati.

Ultima modifica di blackskop : 08-01-2011 alle 18:31.
blackskop è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 19:35   #2
blackskop
Senior Member
 
Iscritto dal: Aug 2008
Messaggi: 308
Una possibile soluzione di cui mi vergogno molto è lasciare i costruttori originari e inizializzare il tutto così:

Codice:
        A a = null;
    	B b = new B(a);
    	a = new A(b);
    	b = new B(a);
blackskop è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 19:45   #3
franksisca
Senior Member
 
L'Avatar di franksisca
 
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
scusa ma la domanda mi sorge spontanea....devi per forza avere questi "riferimetni" incrociati???

per risolvere il problema dei set chiamali semplicemente setA, setB, setC....
__________________
My gaming placement
franksisca è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 20:10   #4
blackskop
Senior Member
 
Iscritto dal: Aug 2008
Messaggi: 308
Quote:
Originariamente inviato da franksisca Guarda i messaggi
scusa ma la domanda mi sorge spontanea....devi per forza avere questi "riferimetni" incrociati???
Si.

Quote:
Originariamente inviato da franksisca Guarda i messaggi
per risolvere il problema dei set chiamali semplicemente setA, setB, setC....
Cioè?
blackskop è offline   Rispondi citando il messaggio o parte di esso
Old 09-01-2011, 00:07   #5
franksisca
Senior Member
 
L'Avatar di franksisca
 
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
sai benissimo che i nomi li definisci tu, io di solito uso questo "standard"

nomeMetodo

per i setters and getters

setNomeVariabile(Object nomeVariabile){...}
Object getNomeVariabile(){...}


quindi, nel caso di costruttore, basterebbe mettere setNomeClasse.


sono tutte cose ovvie, ma magari (mi ci sono trovato molte volte io) sono talmetne banali da sfuggirti...
__________________
My gaming placement
franksisca è offline   Rispondi citando il messaggio o parte di esso
Old 09-01-2011, 00:50   #6
blackskop
Senior Member
 
Iscritto dal: Aug 2008
Messaggi: 308
Quote:
Originariamente inviato da franksisca Guarda i messaggi
sai benissimo che i nomi li definisci tu, io di solito uso questo "standard"

nomeMetodo

per i setters and getters

setNomeVariabile(Object nomeVariabile){...}
Object getNomeVariabile(){...}


quindi, nel caso di costruttore, basterebbe mettere setNomeClasse.


sono tutte cose ovvie, ma magari (mi ci sono trovato molte volte io) sono talmetne banali da sfuggirti...
Non capisco come questo possa risolvere il problema. Puoi fare un breve esempio sulla falsariga del codice che ho postato prima?
blackskop è offline   Rispondi citando il messaggio o parte di esso
Old 09-01-2011, 01:27   #7
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
secondo me ci deve essere un errore di progettazione, due classi distinte che non esistono l'una senza l'altra non hanno molto senso
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 09-01-2011, 01:45   #8
blackskop
Senior Member
 
Iscritto dal: Aug 2008
Messaggi: 308
Quote:
Originariamente inviato da tuccio` Guarda i messaggi
secondo me ci deve essere un errore di progettazione, due classi distinte che non esistono l'una senza l'altra non hanno molto senso
Beh se due oggetti devono comunicare tra loro devono per forza di cose avere una conoscenza reciproca.
blackskop è offline   Rispondi citando il messaggio o parte di esso
Old 09-01-2011, 01:52   #9
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
puoi descrivere più o meno cosa devi fare?
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 09-01-2011, 02:11   #10
blackskop
Senior Member
 
Iscritto dal: Aug 2008
Messaggi: 308
Nel mio caso specifico ho un JPanel che contiene svariati componenti e che si occupa soltanto di aggiornare questi componenti con delle informazioni che gli vengono passate da svariate classi che gestiscono la logica. Quindi dal JPanel vengono invocati i metodi nelle classi che gestiscono la logica che a loro volta invocano altri metodi nel JPanel.

Codice:
public class JPanel {
    private Manager1 manager1;
    private Manager2 manager2;
    private Manager3 manager3;
    ...    

    public void execute1() {
          manager1.test();
          manager2.test();
    }

    public void execute2() {
          manager2.test();
          manager3.test();
    }

    public void execute3() {
          manager1.test();
          manager3.test();
    }

    public void setManager1(Manager1 manager1) { this.manager1 = manager1; }

    public void setManager2(Manager2 manager2) { this.manager2 = manager2; }

    public void setManager3(Manager3 manager3) { this.manager3 = manager3; }

    public void test1(String txt) {
        ;
    }

    public void test2(String txt) {
        ;
    }

    public void test3(String txt) {
        ;
    }
}

class Manager1 {
    private JPanel panel1;

    public void execute() { panel1.test1("pippo"); }

    public void setPanel1(JPanel panel1) { this.panel1 = panel1; }

    public void test() { ; }
}
Se nel JPanel dimentico di fare un setManager, nel momento in cui invoco un execute di JPanel viene sollevata un'eccezione. Esiste un modo elegante per forzare il programmatore ad eseguire prima tutti i set prima dell'utilizzo degli altri metodi? Il problema si risolverebbe trasformando i set in costruttore però c'è il problema dei riferimenti incrociati e sinceramente la soluzione che ho trovato non è per niente elegante.
blackskop è offline   Rispondi citando il messaggio o parte di esso
Old 09-01-2011, 03:05   #11
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2780
Una delle due classi potrebbe "prevalere" sull'altra allocando essa stessa l'istanza dell'altra:
Codice:
public A() { 
   this.b=new B(this);
}

public B(A istanza) { }
Anche se non sono sicuro che si possa fare una cosa del genere ma credo di sì.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 09-01-2011, 14:32   #12
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
non so se è una buona cosa passare il riferimento a un oggetto "in costruzione" (cioè, mi sembra di ricordare che non lo sia, mi sbaglio?)
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2011, 13:13   #13
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da tuccio` Guarda i messaggi
non so se è una buona cosa passare il riferimento a un oggetto "in costruzione" (cioè, mi sembra di ricordare che non lo sia, mi sbaglio?)
Ha rivelanza solo se la tua applicazione è multithreaded e le istanze di quelle classi vengono effettivamente utilizzate da più thread.
Altrimenti nessun problema.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2011, 02:35   #14
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Il this passato nel costruttore è un po' complicato perchè fila liscio, con o senza thread, a patto che, dove il "che" è seguito da un po' di fatti che riguardano l'accessibilità, diretta o indiretta, dei campi, sia nella classe che pubblica il this, sia nelle sue sottoclassi.

La questione è in verità molto semplice: quando pubblichiamo il this, chi lo riceve può accedere ai membri del tipo di quel this. Se i membri accessibili dipendono, direttamente o indirettamente, dal valore di un campo che nel costruttore "pubblicante" è inizializzato dopo la pubblicazione o il cui accesso è sovrascritto dal tipo runtime di quel this allora salterà fuori una null pointer exception, se siamo fortunati e il campo in questione è un riferimento, se è un primitivo siamo anche più nei guai.

esempio:

Codice:
public class Prova {

    public static void main(String[] args) {
        A a = new A();
    }
}

class A {

    private String x;

    A() {
        B b = new B(this);
        x = "hello";
    }

    String getX() {
        return x.toString();
    }
}

class B {

    B(A a) {
        String y = a.getX();
    }
}
Al che uno dice, be', mica son fesso, x = "hello" lo metto prima. Va bene? Manco per idea.

Codice:
public class Prova {

    public static void main(String[] args) {
        A a = new C();
    }
}

class A {

    private String x;

    A() {
        x = "hello";
        B b = new B(this);
    }

    String getX() {
        return x.toString();
    }
}

class B {

    B(A a) {
        String y = a.getX();
    }
}

class C extends A {

    private String y;

    C() {
        y = "world";
    }

    @Override
    String getX() {
        return y.toString();
    }
}
Beninteso, si può fare se si sta attenti. Ma, a conti fatti, è forse un'attenzione più onerosa di quella richiesta dal ricordardi si invocare il setter.

I due setter sono la soluzione più efficace. Non sono la migliore perchè giustamente si dice "così però non riesco ad obbligare il programmatore a invocare quel setter prima di usare i metodi". Giustissimo, preferibile ed encomiabile ma devi cambiare il design. Nota che quando due oggetti vogliono comunicare l'uno con l'altro essi lo fanno condividendo una parte di sè stessi, non tutto quanto, altrimenti cessano di essere due oggetti e al più sono un oggetto solo definito in due unità di compilazione diverse.

Ci sono tante soluzioni ma nessuna di quelle che mi vengono in mente sono così poco "invasive" come i setter.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2011, 21:22   #15
blackskop
Senior Member
 
Iscritto dal: Aug 2008
Messaggi: 308
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Il this passato nel costruttore è un po' complicato perchè fila liscio, con o senza thread, a patto che, dove il "che" è seguito da un po' di fatti che riguardano l'accessibilità, diretta o indiretta, dei campi, sia nella classe che pubblica il this, sia nelle sue sottoclassi.

La questione è in verità molto semplice: quando pubblichiamo il this, chi lo riceve può accedere ai membri del tipo di quel this. Se i membri accessibili dipendono, direttamente o indirettamente, dal valore di un campo che nel costruttore "pubblicante" è inizializzato dopo la pubblicazione o il cui accesso è sovrascritto dal tipo runtime di quel this allora salterà fuori una null pointer exception, se siamo fortunati e il campo in questione è un riferimento, se è un primitivo siamo anche più nei guai.

esempio:

Codice:
public class Prova {

    public static void main(String[] args) {
        A a = new A();
    }
}

class A {

    private String x;

    A() {
        B b = new B(this);
        x = "hello";
    }

    String getX() {
        return x.toString();
    }
}

class B {

    B(A a) {
        String y = a.getX();
    }
}
Al che uno dice, be', mica son fesso, x = "hello" lo metto prima. Va bene? Manco per idea.

Codice:
public class Prova {

    public static void main(String[] args) {
        A a = new C();
    }
}

class A {

    private String x;

    A() {
        x = "hello";
        B b = new B(this);
    }

    String getX() {
        return x.toString();
    }
}

class B {

    B(A a) {
        String y = a.getX();
    }
}

class C extends A {

    private String y;

    C() {
        y = "world";
    }

    @Override
    String getX() {
        return y.toString();
    }
}
Beninteso, si può fare se si sta attenti. Ma, a conti fatti, è forse un'attenzione più onerosa di quella richiesta dal ricordardi si invocare il setter.

I due setter sono la soluzione più efficace. Non sono la migliore perchè giustamente si dice "così però non riesco ad obbligare il programmatore a invocare quel setter prima di usare i metodi". Giustissimo, preferibile ed encomiabile ma devi cambiare il design. Nota che quando due oggetti vogliono comunicare l'uno con l'altro essi lo fanno condividendo una parte di sè stessi, non tutto quanto, altrimenti cessano di essere due oggetti e al più sono un oggetto solo definito in due unità di compilazione diverse.

Ci sono tante soluzioni ma nessuna di quelle che mi vengono in mente sono così poco "invasive" come i setter.
Eh si hai ragione, al limite l'unico modo più leggibile e manutenibile è farsi una classe intermedia che si occupi di associare i vari oggetti :\
Volendo cambiare il design cosa suggerisci? Non mi vorrei buttare in IoC e DI a colpi di spring
blackskop è offline   Rispondi citando il messaggio o parte di esso
Old 12-01-2011, 00:35   #16
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Tutto dipende dall'interpretazione che vuoi dare al problema. Ad esempio potremmo immaginare che la necessità dell'esistenza in A di un riferimento a B per l'esecuzione di talune operazioni sia rappresentata dall'esistenza di una parte di A indefinita fino all'arrivo di un B.

Puoi rappresentare questa parte indefinita con una classe interna. Supponiamo ad esempio che A sia:

Codice:
class A {

    private B b;

    public void setB(B b) { this.b = b; }

    public void operazione1SuB() { System.out.println(b.toString()); }
    public void operazione2SuB() { System.out.println(b.hashCode()); }
    public void operazioneNSuB() { System.out.println(b.getClass()); }
}
Non è possibile impedire a B di essere null ma è possibile evitare che le varie operazioni su B siano tentate senza verificarle una per una con la metafora della parte.

Codice:
class A {

    public class Operazioni {
        Operazioni() { if(b == null) throw new IllegalStateException("b non è definito"); }

        public void operazione1SuB() { System.out.println(b.toString()); }
        public void operazione2SuB() { System.out.println(b.hashCode()); }
        public void operazioneNSuB() { System.out.println(b.getClass()); }
    }

    private B b;
    private Operazioni op;
    public void setB(B b) { this.b = b; }
    public Operazioni op() { return op == null ? op = new Operazioni() : op; }
}
In questo caso Operazioni è quella parte di A che non può esistere senza B e questa impossibilità è imposta durante l'esecuzione dal controllo nel suo costruttore. Di operazioni potrebbero essercene anche due, una che funziona quando c'è b e una che non funziona senza b.

Oppure potremmo pensare ad a come un operatore unario su valori di tipo b. Essendo unario, almeno un b bisogna passarglielo.

Codice:
class A {

    public void operazione1SuB(B b) { System.out.println(b.toString()); }
    public void operazione2SuB(B b) { System.out.println(b.hashCode()); }
    public void operazioneNSuB(B b) { System.out.println(b.getClass()); }
}
Oppure puoi usare dei listener. Se il pannello fa qualcosa quando altre istanze fanno altre cose è possibile immaginare che il pannello sia un ascoltatore degli eventi prodotti dalle altre istanze. Mentre non è possibile la dipendenza incrociata in costruzione (per una questione logica, è una reductio ad infinitum) è possibile che A sia un ascoltatore di B e B un ascoltatore di A:

Codice:
import java.util.LinkedList;
import java.util.List;

public class Prova {

    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        System.out.println("esecuzione senza 'set'");
        a.operazione();
        b.operazione();
        a.add(b);
        b.add(a);
        System.out.println("esecuzione col 'set'");
        a.operazione();
        b.operazione();
    }
}

class A {

    private List<B> listeners = new LinkedList<B>();

    void add(B b) { listeners.add(b); }

    void operazione() {
        for (B b : listeners) b.notifica(this);
    }

    void notifica(B b) {
        System.out.println("A riceve una notifica di un evento prodotto da " + b);
    }
}

class B {

    private List<A> listeners = new LinkedList<A>();

    void add(A a) { listeners.add(a); }

    void operazione() {
        for(A a : listeners) a.notifica(this);
    }

    void notifica(A a) {
        System.out.println("B riceve una notifica di un evento prodotto da " + a);
    }
}
Da un certo punto di vista è più solida perchè senza il set-add le cose funzionano lo stesso - semplicemente non capita nulla. Occorre però fare attenzione coi listener perchè si possono generare dei cicli (se una notifica di A generare un evento di B va in loop).

Con un po' di immaginazione si possono trovare anche altre soluzioni.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design   Recensione OnePlus 15: potenza da vendere e batt...
Superati 13.300 MT/s per DDR5: ad ASUS e...
L’evoluzione dell’IA nelle imprese: la v...
Le storie in evidenza di Instagram torna...
Addio GeForce RTX 5060 e Radeon RX 9060?...
Arriva Hisense Déco TV S5Q, estet...
Aggiornata TOP500, la classifica degli H...
Noctua NH-D15 Chromax.black è rea...
NVIDIA aggiorna DGX Spark: nuovo kernel,...
Con Work IQ, Copilot per Microsoft 365 i...
Azure Cobalt 200: svelata la nuova CPU A...
Intel a tutto tondo: tra processi in ram...
AMD FSR Redstone arriverà ufficia...
L'Olanda 'cede' alla Cina: retromarcia t...
Stagione 1 al via: tutte le novità...
TikTok rafforza trasparenza e benessere ...
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: 22:13.


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