Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    [java] Impedire a un oggetto di essere istanziato

    Ciao a tutti, avrei 1 domanda, posto prima i pezzi di codice

    Nel main istanzio un oggetto
    codice:
    Venditore venditore2 = new Venditore(utente2, "Paypal, accredito bancario, contrassegno", "Negozio");
    Nella classe Venditore
    codice:
    public class Venditore extends Utente {
       private Utente user;
       private String telefono;
       private String pagamentiAccettati;
       private String tipo;
     
       public Venditore(Utente utente, String telefono, String pagamenti, String tipo){
         super(utente);
         setTelefono(telefono);
         setPagamentiAccettati(pagamenti);
         setTipo(tipo);
       }
    
       public Venditore(Utente utente, String pagamenti, String tipo){
         super(utente);
         setPagamentiAccettati(pagamenti);
         setTipo(tipo);
       }
     
       public void setTelefono(String telefono){
         this.telefono=telefono;
       }
    
       public void setPagamentiAccettati(String pagamenti){
         this.pagamentiAccettati=pagamenti;
       }
    
       public void setTipo(String tipo){
         if (tipo=="Negozio" || tipo=="negozio" || tipo=="privato" || tipo=="Privato")
            this.tipo=tipo;
       }
    Ora questo metodo setTipo(String tipo) è imperfetto, perchè tipo nel caso in cui la parola non sia privato o negozio, assume il valore di default per le stringhe che è null. L'oggetto è istanziato lo stesso dunque.

    Io NON voglia che sia istanziato, cioè metterei un else con una frase a schermo che impedisca di istanziare venditore2

    Avevo pensato di lanciare un'eccezione da me creata ma non mi viene in mente cosa fare per dire: NON istanziare venditore2.

    Qualcuno mi aiuta? Grazie

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: [java] Impedire a un oggetto di essere istanziato

    Originariamente inviato da mishima
    Ora questo metodo setTipo(String tipo) è imperfetto, perchè tipo nel caso in cui la parola non sia privato o negozio, assume il valore di default per le stringhe che è null. L'oggetto è istanziato lo stesso dunque.

    Io NON voglia che sia istanziato, cioè metterei un else con una frase a schermo che impedisca di istanziare venditore2

    Avevo pensato di lanciare un'eccezione da me creata ma non mi viene in mente cosa fare per dire: NON istanziare venditore2.

    Qualcuno mi aiuta? Grazie
    Fagli lanciare una IllegalArgumentException, no?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Grazie Alex, ho provato ma da 1 errore che non capisco, dice che trova variabile1 nelle cose che lo usano dopo al try (venditore1.stampa() o la system.out di venditore1 che ho messo ora di prova). E' come se lanciasse sempre l'eccezzione, eppure l'if mi sembra corretto

    Classe Venditore
    codice:
       public void setTipo(String tipo){
         if (tipo=="Negozio" || tipo=="negozio" || tipo=="privato" || tipo=="Privato")
            this.tipo=tipo;
         else {
            throw new IllegalArgumentException();}
       }
    Main
    codice:
        try{
        Venditore venditore1 = new Venditore(utente1, "012345678", "Post-pay, vaglia postale", "Privato");
        }
    
        catch (IllegalArgumentException ill){
          System.out.println("Devi inserire in privato o negozio");
        }
        System.out.println(venditore1); 
        Venditore venditore2 = new Venditore(utente2, "Paypal, accredito bancario, contrassegno", "Negozio");
    
        venditore1.stampa(); 
        venditore2.stampa();

  4. #4
    Utente di HTML.it L'avatar di neroux
    Registrato dal
    Aug 2009
    Messaggi
    1,973
    Ottiene questo errore perché dichiari la variabile dentro del try e quindi è visibile solo nel suo blocco.

    Dovresti dichiararla fuori ...
    codice:
    Venditore venditore1=null;
    try
    {
       venditore1 = new Venditore(utente1, "012345678", "Post-pay, vaglia postale", "Privato");
    }
    catch (IllegalArgumentException ill)
    {
        System.out.println("Devi inserire in privato o negozio");
    }
    System.out.println(venditore1); 
    Venditore venditore2 = new Venditore(utente2, "Paypal, accredito bancario, contrassegno", "Negozio");
    
    venditore1.stampa(); 
    venditore2.stampa();

    Però sinceramente non lo farei così, ma anzichè oppure un boolean, quindi invece della stringa tipo, ci metterei
    codice:
    private boolean shop;
    che indichi se si tratta di un negozio oppure no.

    L'altra soluzione sarebbe usare un Enum, http://java.sun.com/docs/books/tutor...vaOO/enum.html, stile
    codice:
    public enum UserType
    {
        NEGOZIO, PRIVATO
    }

    www.sitemeer.com » Quando un sito pare irraggiungibile

    Se ti piace ci puoi trovare anche su Facebook

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da mishima
    codice:
         if (tipo=="Negozio" || tipo=="negozio" || tipo=="privato" || tipo=="Privato")
    Le stringhe non vanno confrontate per l'uguaglianza con == ma con equals().

    Originariamente inviato da neroux
    L'altra soluzione sarebbe usare un Enum, http://java.sun.com/docs/books/tutor...vaOO/enum.html
    Certo ... ma sarebbe ancora possibile passare un null.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Giusto
    codice:
       public void setTipo(String tipo){
         if (tipo.equals("Negozio") || tipo.equals("negozio") || tipo.equals("privato") || tipo.equals("Privato"))
            this.tipo=tipo;
         else {
            throw new IllegalArgumentException();}
       }
    Mmm, ho corretto cosi'

    codice:
    Venditore venditore1 = null;
        try{
        venditore1 = new Venditore(utente1, "012345678", "Post-pay, vaglia postale", "Priato");
        }
    
        catch (IllegalArgumentException ecc1){
          System.out.println("Devi inserire in privato o negozio");         
        }
        Venditore venditore2 = new Venditore(utente2, "Paypal, accredito bancario, contrassegno", "Negozio");
    
        venditore1.stampa();
        venditore2.stampa();
    ma casomai mettessi un valore sbagliato, esempio: Priato, mi dice NullPointerException
    Dovrei fare una catch nella catch, è possibile?

    Cambio proprio stategia? Uso le enum? La variabile booleana shop non mi convince perchè se aumentassi il numero di valore per tipo, non andrebbe piu' bene :master:

  7. #7
    Utente di HTML.it L'avatar di neroux
    Registrato dal
    Aug 2009
    Messaggi
    1,973
    Originariamente inviato da andbin
    Certo ... ma sarebbe ancora possibile passare un null.
    Sì, certo, ma in quei casi io di solito distinguo sempre se si tratta di un API oppure solo un codice di un'applicazione etc ...

    Spesso non è necessario di fare proprio un check sul parametro, perché avrai già la tua bella NullPointer exception quando lo stai per accedere - però ovviamente dipende

    www.sitemeer.com » Quando un sito pare irraggiungibile

    Se ti piace ci puoi trovare anche su Facebook

  8. #8
    Utente di HTML.it L'avatar di neroux
    Registrato dal
    Aug 2009
    Messaggi
    1,973
    Originariamente inviato da mishima
    Cambio proprio stategia? Uso le enum? La variabile booleana shop non mi convince perchè se aumentassi il numero di valore per tipo, non andrebbe piu' bene :master:
    Sì, il boolean va bene solo se non hai più di due stati/tipi. Poi sceglierei l'enum.

    www.sitemeer.com » Quando un sito pare irraggiungibile

    Se ti piace ci puoi trovare anche su Facebook

  9. #9
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da mishima
    Giusto
    codice:
       public void setTipo(String tipo){
         if (tipo.equals("Negozio") || tipo.equals("negozio") || tipo.equals("privato") || tipo.equals("Privato"))
            this.tipo=tipo;
         else {
            throw new IllegalArgumentException();}
       }
    Meglio così:
    codice:
      public void setTipo(String tipo) throws IllegalArgumentException {
        if (tipo.equalsIgnoreCase("negozio") || tipo.equalsIgnoreCase("privato")) {
            this.tipo = tipo;
        } else {
            throw new IllegalArgumentException("Tipi ammessi: \"negozio\" oppure \"privato\"");
        }
      }
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  10. #10
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da mishima
    codice:
    Venditore venditore1 = null;
        try{
        venditore1 = new Venditore(utente1, "012345678", "Post-pay, vaglia postale", "Priato");
        }
    
        catch (IllegalArgumentException ecc1){
          System.out.println("Devi inserire in privato o negozio");         
        }
        Venditore venditore2 = new Venditore(utente2, "Paypal, accredito bancario, contrassegno", "Negozio");
    
        venditore1.stampa();
        venditore2.stampa();
    ma casomai mettessi un valore sbagliato, esempio: Priato, mi dice NullPointerException
    Dovrei fare una catch nella catch, è possibile?
    Ti da NullPointerException su venditore1.stampa() vero? Per forza, se l'instanziazione fallisce (a causa del tipo errato) l'oggetto non viene creato! Nel catch non dovresti "andare avanti", dovresti permettere all'utente di inserire il valore corretto!
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

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.