Avatar billede dennish Nybegynder
21. december 2006 - 16:47 Der er 5 kommentarer og
1 løsning

Kopiere objekt

Hej Jeg har et objekt jeg gerne vbil kopiere.
Objektet indeholder en masser variabler (med tlhørende get'er og set'er metoder( dog ikke vist i kodeudsnittet)


public class Course implements Serializable
{
public final static int RESOURCE_PAGE = 1;

  public final static int RESOURCE_SCORM = 2;
  public final static int RESOURCE_TEST = 3;
  public final static int NODE = 1;
  public final static int LEAF = 2;
  public final static int NO = 0;
  public final static int YES = 1;
  private int id = -1;
  private int rootid = -1;
  private int type = -1;
  private int position = -1;
  private int visible = -1;
  private int active = -1;
  private Integer resourcetype = null; 
  private Integer testid = -1; 
  private String title = null;
  .... osv.

  get'er og set'er ...

}



Hvordan kopierer jeg mit objekt ??????
Ved godt at jeg kan lave

Course oldCourse = new Course();
Course newCourse = new Course();
newCourse.setId(oldCourse.getId());

Men i og med jeg har en masser variabler virker det alt for besværligt. Er det en nemmere måde at gøre det på ( måske gøre brug af Hash.map ) ?

Har nedenstående koden. Den virker. MEN fordi jeg har brug for at udskfte værdier såsom id og rootId, iden jeg gemmer objektet i min database ( bruger Hibernatet) har jeg brug for at løbe mine værdier igennem og udskifte nogle af dem.

Er den nogen der har nogle ideer eller løsningsforslag ?


private Object deepCopy(Object oldObj) throws Exception
  {
      ObjectOutputStream oos = null;
      ObjectInputStream ois = null;
      try
      {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        oos = new ObjectOutputStream(bos);
        oos.writeObject(oldObj); 
        oos.flush();             
        ByteArrayInputStream bin = new ByteArrayInputStream(bos.toByteArray());
        ois = new ObjectInputStream(bin);                 
        return ois.readObject();
      }
      catch(Exception e)
      {
        log.info("deepCopy");
         
        throw(e);
      }
      finally
      {
        oos.close();
        ois.close();
      }
  }
Avatar billede arne_v Ekspert
21. december 2006 - 18:36 #1
Den paene maade er vel at implementere Cloneable og clone plus kalde de rette set metoder
med de nye vaerdier.
Avatar billede dennish Nybegynder
21. december 2006 - 19:33 #2
Arne>> så hvis jeg forstår dig ret.
Så vil du klone det pågældende objekt (objekt.clone() ) og derefter vil du kalder set metoder på det klonede objekt ?
Avatar billede dennish Nybegynder
21. december 2006 - 19:36 #3
Men kan clone gør det.
Mit objekt indeholder en Set, hvor jeg har en mange til mange mapning (Hibernate)

private Set childitems = new HashSet();

/**
  * @hibernate.set table="course_item_to_item" lazy="true" cascade="all"
  * @hibernate.collection-key column="la_course_item_id"
  * @hibernate.collection-many-to-many class="Course"
  *                                    column="la_course_item_child_id"
  *
  * @return Returns the locations.
  */
  public Set getChilditems() {
    return childitems;
  }

  public void setChilditems(Set childitems) {
    this.childitems = childitems;
  }
Avatar billede arne_v Ekspert
23. december 2006 - 17:52 #4
ja

----

både TreeSet og HashSet er selv Cloneable men shallow clone ikke deep clone

du skal derfor nok have en del kode i din clone metode

men jeg mener stadig at det er den rigtige måde

hvordan du skal håndtere din M:M relation må afhænge af problem stillingen
Avatar billede dennish Nybegynder
29. december 2006 - 12:48 #5
Arne>> tusinde tak for dine meget konstruktive kommentarer. Smider du ikke lige et svar :-)
Avatar billede arne_v Ekspert
29. december 2006 - 13:52 #6
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester