Questão básica sobre estado dos objetos na criação (construção/instanciação)

View: New views
6 Messages — Rating Filter:   Alert me  

Questão básica sobre estado dos objetos na criação (construção/instanciação)

by Jean Michel :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Some parts of this message have been removed. Learn more about Nabble's security policy.

Galera, levando ao pé da letra aquela história de “não se permitir criar um objeto inconsistente”, faz sentido algo do tipo:

 

public Product(int id, String description, double price) throws Exception {

    if (description == null || description.equals("")) {

        throw new Exception("Null description is not allowed.");

    }

   

    this.id = id;

    this.description = description;

    this.price = price;

}

 

Uma exceção no construtor?



--
Best regards,
Jean J. Michel

* Sent from my cellphone, please forgive the lack of accents and punctuation marks ;)
My blog: http://www.jeanjmichel.blogspot.com
My Twitter: http://twitter.com/jeanjmichel

Re: Questão básica sobre estado dos objetos na criação (construção/instanciação)

by João Bier :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Se o atributo faz parte da invariante do objeto, sem problemas.
Na pratica, vc decide o melhor momento, impede  a criação do objeto ou da lança um erro na hora de utiliza-lo.

[]´s

2009/10/15 Jean Michel <jeanjmichel@...>

Galera, levando ao pé da letra aquela história de “não se permitir criar um objeto inconsistente”, faz sentido algo do tipo:

 

public Product(int id, String description, double price) throws Exception {

    if (description == null || description.equals("")) {

        throw new Exception("Null description is not allowed.");

    }

   

    this.id = id;

    this.description = description;

    this.price = price;

}

 

Uma exceção no construtor?



--
Best regards,
Jean J. Michel

* Sent from my cellphone, please forgive the lack of accents and punctuation marks ;)
My blog: http://www.jeanjmichel.blogspot.com
My Twitter: http://twitter.com/jeanjmichel



--
Atenciosamente,

João Bier.

Re: Questão básica sobre estado dos objetos na criação (construção/instanciação)

by Valdemar Júnior :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

eu acho que faz sentido sim. Se o objeto for persistido, você já mata o problema na criação do objeto, que quando o objeto for persistido, não vai precisar de validação verificando se "description" está "preenchido.

2009/10/15 João Bier <joaobier@...>
Se o atributo faz parte da invariante do objeto, sem problemas.
Na pratica, vc decide o melhor momento, impede  a criação do objeto ou da lança um erro na hora de utiliza-lo.

[]´s

2009/10/15 Jean Michel <jeanjmichel@...>

Galera, levando ao pé da letra aquela história de “não se permitir criar um objeto inconsistente”, faz sentido algo do tipo:

 

public Product(int id, String description, double price) throws Exception {

    if (description == null || description.equals("")) {

        throw new Exception("Null description is not allowed.");

    }

   

    this.id = id;

    this.description = description;

    this.price = price;

}

 

Uma exceção no construtor?



--
Best regards,
Jean J. Michel

* Sent from my cellphone, please forgive the lack of accents and punctuation marks ;)
My blog: http://www.jeanjmichel.blogspot.com
My Twitter: http://twitter.com/jeanjmichel



--
Atenciosamente,

João Bier.



--
Valdemar Júnior
SCJP 5.0, SCWCD1.4, SCBCD 5.0, SCSNI
WebSite: http://www.valdemarjr.net
Mobile: (+55) (19) 9286 2226
Blog: http://valdemarjr.blogspot.com/
-----------------------------------------------

Re: Questão básica sobre estado dos objetos na criação (construção/instanciação)

by João Guilherme :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

É correto sim. O motivo é que implicitamente, o super() é chamado antes de qualquer coisa. Quando você compila o java coloca o super() na primeira linha do construtor que irá chamar o construtor da classe Object (se não for extends alguma coisa), mas você pode colocar tb, o efeito é o mesmo.

Assim, nas próximas linhas você pode chamar o this sem problema. Você também pode colocar o this() para referenciar o seu construtor sem argumento e esse construtor sem argumento também irá chamar o super().

Ex:

public class Teste
{
   public Teste()
   {
      super();
   }

   public Teste(int a)
   {
      this();
      // codigos ...
   }
}

2009/10/15 Valdemar Júnior <valdemarjuniorr@...>
eu acho que faz sentido sim. Se o objeto for persistido, você já mata o problema na criação do objeto, que quando o objeto for persistido, não vai precisar de validação verificando se "description" está "preenchido.

2009/10/15 João Bier <joaobier@...>

Se o atributo faz parte da invariante do objeto, sem problemas.
Na pratica, vc decide o melhor momento, impede  a criação do objeto ou da lança um erro na hora de utiliza-lo.

[]´s

2009/10/15 Jean Michel <jeanjmichel@...>

Galera, levando ao pé da letra aquela história de “não se permitir criar um objeto inconsistente”, faz sentido algo do tipo:

 

public Product(int id, String description, double price) throws Exception {

    if (description == null || description.equals("")) {

        throw new Exception("Null description is not allowed.");

    }

   

    this.id = id;

    this.description = description;

    this.price = price;

}

 

Uma exceção no construtor?



--
Best regards,
Jean J. Michel

* Sent from my cellphone, please forgive the lack of accents and punctuation marks ;)
My blog: http://www.jeanjmichel.blogspot.com
My Twitter: http://twitter.com/jeanjmichel



--
Atenciosamente,

João Bier.



--
Valdemar Júnior
SCJP 5.0, SCWCD1.4, SCBCD 5.0, SCSNI
WebSite: http://www.valdemarjr.net
Mobile: (+55) (19) 9286 2226
Blog: http://valdemarjr.blogspot.com/
-----------------------------------------------



--
João Guilherme
Analista Desenvolvedor Java - SCJP 1.5


Re: Questão básica sobre estado dos objetos na criação (construção/instanciação)

by Fabio Patricio :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


O grande problema com esse tipo de abordagem é quando se usa framework de persistencia. Ai precisamos utilizar POJO e nesse caso obrigatoriamente teremos que ter um construtor default assim a validação no construtor foi pro espaço.

Espalhar regras de validação também não é uma boa.




2009/10/16 João Guilherme <jgbarros@...>
É correto sim. O motivo é que implicitamente, o super() é chamado antes de qualquer coisa. Quando você compila o java coloca o super() na primeira linha do construtor que irá chamar o construtor da classe Object (se não for extends alguma coisa), mas você pode colocar tb, o efeito é o mesmo.

Assim, nas próximas linhas você pode chamar o this sem problema. Você também pode colocar o this() para referenciar o seu construtor sem argumento e esse construtor sem argumento também irá chamar o super().

Ex:

public class Teste
{
   public Teste()
   {
      super();
   }

   public Teste(int a)
   {
      this();
      // codigos ...
   }
}

2009/10/15 Valdemar Júnior <valdemarjuniorr@...>
eu acho que faz sentido sim. Se o objeto for persistido, você já mata o problema na criação do objeto, que quando o objeto for persistido, não vai precisar de validação verificando se "description" está "preenchido.

2009/10/15 João Bier <joaobier@...>

Se o atributo faz parte da invariante do objeto, sem problemas.
Na pratica, vc decide o melhor momento, impede  a criação do objeto ou da lança um erro na hora de utiliza-lo.

[]´s

2009/10/15 Jean Michel <jeanjmichel@...>

Galera, levando ao pé da letra aquela história de “não se permitir criar um objeto inconsistente”, faz sentido algo do tipo:

 

public Product(int id, String description, double price) throws Exception {

    if (description == null || description.equals("")) {

        throw new Exception("Null description is not allowed.");

    }

   

    this.id = id;

    this.description = description;

    this.price = price;

}

 

Uma exceção no construtor?



--
Best regards,
Jean J. Michel

* Sent from my cellphone, please forgive the lack of accents and punctuation marks ;)
My blog: http://www.jeanjmichel.blogspot.com
My Twitter: http://twitter.com/jeanjmichel



--
Atenciosamente,

João Bier.



--
Valdemar Júnior
SCJP 5.0, SCWCD1.4, SCBCD 5.0, SCSNI
WebSite: http://www.valdemarjr.net
Mobile: (+55) (19) 9286 2226
Blog: http://valdemarjr.blogspot.com/
-----------------------------------------------



--
João Guilherme
Analista Desenvolvedor Java - SCJP 1.5



Re: Questão básica sobre estado dos objetos na criação (construção/instanciação)

by João Bier :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Como quase tudo, depende da situação.
É uma regra de negocio ou do objeto?
A questão é que se eu preciso do objeto pronto para ser usado, eu tenho que impedir que ele seja criado sem um estado consistente. É uma regra da criação objeto.
As validações que fazemos normalmente levam em consideração o negocio, não pensamos muito nos objetos.
Eu não posso por exemplo criar um FileWriter(File f), se o file apontar p/ path inexistente, a exceção é lançada no construtor.
No caso de um POJO, sim não faz muito sentido, principalmente se ele esta sendo usado por um framework.

[]´s

2009/10/16 Fabio Patricio <fabio.patricio@...>

O grande problema com esse tipo de abordagem é quando se usa framework de persistencia. Ai precisamos utilizar POJO e nesse caso obrigatoriamente teremos que ter um construtor default assim a validação no construtor foi pro espaço.

Espalhar regras de validação também não é uma boa.




2009/10/16 João Guilherme <jgbarros@...>

É correto sim. O motivo é que implicitamente, o super() é chamado antes de qualquer coisa. Quando você compila o java coloca o super() na primeira linha do construtor que irá chamar o construtor da classe Object (se não for extends alguma coisa), mas você pode colocar tb, o efeito é o mesmo.

Assim, nas próximas linhas você pode chamar o this sem problema. Você também pode colocar o this() para referenciar o seu construtor sem argumento e esse construtor sem argumento também irá chamar o super().

Ex:

public class Teste
{
   public Teste()
   {
      super();
   }

   public Teste(int a)
   {
      this();
      // codigos ...
   }
}

2009/10/15 Valdemar Júnior <valdemarjuniorr@...>
eu acho que faz sentido sim. Se o objeto for persistido, você já mata o problema na criação do objeto, que quando o objeto for persistido, não vai precisar de validação verificando se "description" está "preenchido.

2009/10/15 João Bier <joaobier@...>

Se o atributo faz parte da invariante do objeto, sem problemas.
Na pratica, vc decide o melhor momento, impede  a criação do objeto ou da lança um erro na hora de utiliza-lo.

[]´s

2009/10/15 Jean Michel <jeanjmichel@...>

Galera, levando ao pé da letra aquela história de “não se permitir criar um objeto inconsistente”, faz sentido algo do tipo:

 

public Product(int id, String description, double price) throws Exception {

    if (description == null || description.equals("")) {

        throw new Exception("Null description is not allowed.");

    }

   

    this.id = id;

    this.description = description;

    this.price = price;

}

 

Uma exceção no construtor?



--
Best regards,
Jean J. Michel

* Sent from my cellphone, please forgive the lack of accents and punctuation marks ;)
My blog: http://www.jeanjmichel.blogspot.com
My Twitter: http://twitter.com/jeanjmichel



--
Atenciosamente,

João Bier.



--
Valdemar Júnior
SCJP 5.0, SCWCD1.4, SCBCD 5.0, SCSNI
WebSite: http://www.valdemarjr.net
Mobile: (+55) (19) 9286 2226
Blog: http://valdemarjr.blogspot.com/
-----------------------------------------------



--
João Guilherme
Analista Desenvolvedor Java - SCJP 1.5





--
Atenciosamente,

João Bier.