Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 25-07-2011, 18:41   #1
FabryHw
Bannato
 
Iscritto dal: Apr 2006
Messaggi: 5857
[JAVA] DTO/Entity come ritornare/gestire i sottoggetti ?

Stavo implementando un layer di accesso alla base dati usando dei DTO (anche se sarebbero più degli Entity Beans) con relative classi DAO che usano JDBC (JPA/Hibernate scartati dopo mesi di litigi e grosse difficoltà ad adattarli a DB esistenti) e mi sono venuti dei dubbi (scarsa esperienza sulla cosa) su come gestire il passaggio degli oggetti non primitivi.

Facciamo un esempio con una classe DTO che contiene 2 oggetti non primitivi:
Codice:
public class MyDTO implements Serializable {
    @NotNull
    private Key1 pKey = new Key1();

    private String description;

    @NotNull
    private String attribute1;

    @Min(value=0)
    private int quantity;

    @NotNull
    private Key categoryFKey = new Key2();

    public MyDTO () {
    }

... 
}
con le altre classi così definite:
Codice:
public class Key1 implements Serializable {
    @Min(value=1)
    private int id;

    @NotNull @Size(min=1, max=2)
    private String type;

    public Key1 () {
    }

    public Key1 (int id, String type) {
        this.id= id;
        this.type = type;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id= id;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
   }

    @Override
    public int hashCode() {
       ...
    }

    @Override
    public boolean equals(Object object) {
        ...
    }
    
    @Override
    public String toString() {
        ...
    }
}
Codice:
public class Key2 implements Serializable {

    @NotNull @Size(min=1, max=4)
    private String category;

    @NotNull @Size(min=1, max=2)
    private String subCategory;

    public Key2 () {
    }

    public Key2 (String category, String subCategory) {
        this.category= category;
        this.subCategory= subCategory;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category= category;
    }

    public String getSubCategory() {
        return subCategory;
    }

    public void setSubCategory(String subCategory) {
        this.subCategory= subCategory;
   }

    @Override
    public int hashCode() {
       ...
    }

    @Override
    public boolean equals(Object object) {
        ...
    }
    
    @Override
    public String toString() {
        ...
    }
}
Ora il mio dubbio è come devono essere i getter/setter di MyDTO quando hanno a che fare con gli oggetti non primitivi.
Ossia ritornare una copia del riferimento all'oggetto contenuto o clonare questo oggetto e ritornare il riferimento alla copia.

Codice Soluzione 1:
Codice:
    public Key1 getPK() {
        return pKey;
    }

    public void setPK(Key1 pKey) {
        this.pKey= pKey;
    }

    public Key2 getCategoryFKey() {
        return categoryFKey;
    }

    public void setCategoryFKey(Key2 fKey) {
        this.categoryFKey = fKey;
    }
Codice Soluzione 2:
Codice:
    public Key1 getPK() {
        Key1 clone = new Key1();
        clone.setId(pKey.getId());
        clone.setType(pKey.getType());
        return clone;
//Oppure in modo meno prolisso un
//        return new Key1(pKey.getId(), pKey.getType());
    }

    public void setPK(Key1 pKey) {
        this.pKey.setId(pKey.getId());
        this.pKey.setType(pKey.getType());
    }

    public Key2 getCategoryFKey() {
        return new Key2(categoryFKey.getCategory(), categoryFKey.getSubCategory();
    }

    public void setCategoryFKey(Key2 fKey) {
        this.categoryFKey.setCategory(fKey.getCategory());
        this.categoryFKey.setSubCategory(fKey.getSubCategory());
    }
Con la prima soluzione i vantaggi sono:
  • Codice più semplice per i getter e setter (spesso autogenerato dall'IDE)
  • Possibilità di condividere alcuni oggetti interni tra più oggetti
  • Non vengono creati oggetti a vita brevissima (necessari solo per passare i parametri)
  • Se cambio le definizioni di Key1 o Key2 automaticamente MyDTO è aggiornato senza dover modificare il suo codice
ma gli svantaggi sono:
  • Espongo lo stato interno dell'oggetto a modifiche indirette
  • Rischio che modifiche a nuovi oggetti indirettamente (e probabilmente erroneamente) cambino anche altri oggetti già esistenti.
    Esempio
    Codice:
    MyDTO obj1 = new MyDTO();
    ....
    Key2 cat = obj1.getCatogoryFKey();
    MyDTO obj2 = new MyDTO();
    ...
    obj2.setCategoryFKey(cat);
    ...
    obj2.getCategoryFKey().setCategory("0200");
    obj2.getCategoryFKey().setSubCategory("IT");
    ecco le ultime 2 righe volevano assegnare una nuova categoria a obj2 ma indirettamente l'hanno cambiata anche a obj1
  • Più facile cadere in memory leaks causa riferimenti incrociati e/o condivisi tra vari oggetti
La soluzione 2 ha come vantaggi:
  • Lo stato interno di ogni oggetto è modificabile solo attraverso i setter e modifiche agli oggetti esportati non cambiano lo stato interno di chi li ha esportati.
  • Più difficile che avvegano memory leaks
ma per contro presenta come svantaggi:
  • Getter e Setter più complicati da scrivere
  • Se cambiano Key1 e Key2 bisogna rivedere tutti i getter e setter di MyDTO coinvolti a meno di trovare una soluzione generica per il cloning.
  • Vengono creati tanti oggetti a vita brevissima per passare i parametri o restituire il risultato.
    Maggiore lavoro per il garbage collector e maggior uso di cpu nel creare i duplicati.
  • Maggior uso di memoria perché non si condivide nulla (anche quando si poteva farlo in sicurezza) ed ogni oggetto interno è duplicato

Quindi qual'è l'approccio migliore ?
C'è una terza possibilità ?

Ultima modifica di FabryHw : 25-07-2011 alle 20:19.
FabryHw è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Samsung Galaxy A07 5G: il nuovo entry le...
Realme 16 in arrivo: un mix tra iPhone A...
Domenica di follia su Amazon: iPhone 17 ...
Questo portatile HP OMEN con Core Ultra ...
Robot aspirapolvere al prezzo giusto: le...
Il nuovo M5 Max potrebbe avere una GPU p...
Pulizie automatiche al top (e a prezzo B...
Casa più calda, spese più leggere: Tado ...
Mini PC mostruoso in offerta nascosta su...
Netflix promette 45 giorni di esclusivit...
Gigabyte: un handheld? Sì, ma sol...
Samsung conferma l'arrivo di tre variant...
Sottile, veloce e con un'ottima autonomi...
Il top di gamma compatto di OnePlus &egr...
Modificare l'indirizzo Gmail è finalment...
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:26.


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