Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Oggetto con campo Calendar cambia valore "senza motivo"

    Buongiorno a tutti! Non so se dalla domanda si capisca bene il mio problema, ammetto che non è semplice. Praticamente io ho una classe Evento:
    codice:
    public abstract class Evento {    private String nome;
        private Calendar start;
        private int durata;
        private String luogo;
        private Calendar fine;
    
    
        public Evento(String nome, Calendar start, int durata, String luogo) {
            this.nome = nome;
            this.start = start;
            this.durata = durata;
            this.luogo = luogo;
            fine();
        }
    
    
        public Calendar getFine() {
            return fine;
        }
    
    
        public void setFine(Calendar fine) {
            this.fine = fine;
        }
    
    
        public String getNome() {
            return nome;
        }
    
    
    
    
        public int getDurata() {
            return durata;
        }
    
    
        public Calendar getStart() {
            return start;
        }
    
    
        public String getLuogo() {
            return luogo;
        }
        
        public abstract void fine();
    }
    e una classe Agenda, che, tra le altre cose ha la funzione di creare nuovi eventi, usando questo metodo:
    codice:
        public void nuovoEvento(String nome, String luogo, int giorno, int mese, int anno, int inizioH, int inizioM, int durata) {        Calendar inizio = new GregorianCalendar(anno, mese, giorno, inizioH, inizioM);
            Evento e = new Semplice(nome, inizio, durata, luogo);
            if (verifica(e) == true) {
                eventi.add(e);
            }
        }
    Ora, io provo a creare due eventi, diciamo A e B. L'evento A viene creato perfettamente, con l'inizio dove lo voglio io e la fine corretta. Viene quindi aggiunto alla lista. L'evento B viene invece creato con la fine giusta, ma l'inizio completamente diverso. Sbaglio qualcosa? Ovviamente resto a disposizione per qualsiasi chiarimento.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Purtroppo non ho molto tempo ora e comunque non hai esposto tutto, nel senso che bisognerebbe anche vedere quella classe Semplice per capire come estende e specializza Evento.

    Però una cosa te la dico, in generale, come affermazione: Il costruttore di una classe NON dovrebbe (mai!) invocare un metodo della propria classe che è soggetto ad override in una sotto-classe.

    Prova un po' a pensare perché ...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Questa è la classe Semplice:
    codice:
    public class Semplice extends Evento{
    
        public Semplice(String nome, Calendar start, int durata, String luogo) {
            super(nome, start, durata, luogo);
            fine();
        }
    
    
    
    
        public void fine(){
            Calendar inizio = null;
            inizio = getStart();
            Calendar fine = null;
            fine = (Calendar)inizio.clone();
            fine.add(Calendar.MINUTE, getDurata());
            setFine(fine);
        }
    }
    P.S. Ho spostato l'invocazione a fine() qui, spero di aver afferrato il perchè non andasse bene prima

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    C'è comunque una questione concettuale che non quadra già a partire da Evento. Esso ha start, fine ma anche durata. Siccome il fine è mutabile (con setFine), allora durata può diventare incoerente rispetto all'intervallo start-fine. E quindi .... non ha senso.

    Devi rivedere meglio il concetto di Evento e di cosa una sotto-classe può specializzarlo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Ora ho messo inizio e fine come parametri di Evento. Una cosa "curiosa" che mi succede è che, una volta messi gli eventi in un ArrayList, il primo abbia inizio e fine corretti, il secondo solo la fine.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da luca93abc Visualizza il messaggio
    Ora ho messo inizio e fine come parametri di Evento.
    Non è quella la questione. Se in Evento ci sono sia fine che durata e anche il void setFine(Calendar fine), allora c'è la potenziale incoerenza tra il concetto di inizio/fine e durata.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    La classe fine ora è questa:
    codice:
    public abstract class Evento {    private String nome;
        private Calendar inizio;
        private Calendar fine;
        private String luogo;
    
    
        public Evento(String nome, Calendar inizio, Calendar fine, String luogo) {
            this.nome = nome;
            this.inizio = inizio;
            this.fine = fine;
            this.luogo = luogo;
        }
    
    
        public String getNome() {
            return nome;
        }
    
    
        public Calendar getInizio() {
            return inizio;
        }
    
    
        public Calendar getFine() {
            return fine;
        }
        
        public String getLuogo() {
            return luogo;
        }
    
    
        public void setNome(String nome) {
            this.nome = nome;
        }
    
    
        public void setInizio(Calendar inizio) {
            this.inizio = inizio;
        }
    
    
        public void setFine(Calendar fine) {
            this.fine = fine;
        }
    
    
        public void setLuogo(String luogo) {
            this.luogo = luogo;
        }
    
    
        
    }
    Conseguentemente il metodo nuovoEvento della classe Agenda è:
    codice:
        public void nuovoEvento(String nome, String luogo, int giorno, int mese, int anno, int inizioH, int inizioM, int durata) {        Calendar inizio = calendarize(giorno, mese, anno, inizioH, inizioM);
            long fineMillis = inizio.getTimeInMillis() + durata*60000;
            Calendar fine = new GregorianCalendar();
            fine.setTimeInMillis(fineMillis);
            Evento e = new Semplice(nome, inizio, fine, luogo);
    
    
            if (verifica(e) == true) {
                eventi.add(e);
            }
            
        }
    dove calendarize(...) è solo un piccolo metodo che, dati i valori interi restituisce l'oggetto Calendar... diciamo che è stato per semplificare!

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Se all'interno degli oggetti degli eventi non c'è più la nozione della "durata", allora il concetto è corretto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Però il problema persiste, nel senso che io testo il programma con due eventi:
    codice:
            a.nuovoEvento("Evento A", "Milano", 27, 1, 2017, 15, 30, 120);
            a.nuovoEvento("Evento B", "Roma", 16, 1, 2017, 15, 0, 60);
    Quando stampo -nella stessa classe- la lista di eventi (Nome + data + ora_Inizio + ora_fine), ottengo:
    codice:
    Evento A 27/1/2017    15:30    17:30    Milano
    Evento B 16/1/2017    19:31    16:0    Roma

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.