Duda al crear objeto

Iniciado por Baal_30, 10 Marzo 2015, 22:24 PM

0 Miembros y 1 Visitante están viendo este tema.

Baal_30

Muy buenas, vuelvo con otra duda :P

En el caso de crear un objeto, que le pasas al constructor un número que por ejemplo es la edad como argumento tipo así :  Objeto obj1 = new Objeto(10);

Si no quisieras que se creara el objeto si la edad es menor de 18, ¿como se haría?

Lo que he hecho ha sido esto en el constructor :

Código (java) [Seleccionar]
public Objeto(int edad){
if(edad>=18){
this.edad = edad;
}
else{
System.out.println("No puedes crear este objeto con una edad menor de 18");
}
}


El problema es que el objeto lo crea igual, pero no le mete la edad, pero el objeto queda creado, con la edad a null (si no me equivoco).

Como se podría hacer para que directamente ni se crease el objeto ¿? Había pensado en hacerlo desde el main, pedir la nota ahí, haciendo un do-while por ejemplo que la siga pidiendo hasta que sea más de 18 y luego ya que la pase como argumento. Pero me gustaría saber si hay alguna otra forma más correcta de hacerlo.

Gracias de antemano y un saludo :)
«La suerte es el cuidado de los detalles». -Winston Churchill

PabloPbl

Yo lo haría con un if, primero haría las comprobaciones y si es mayor de 18 creo el objeto, total ya se que tiene mas de 18 años.
En resumen: Comprobaría si la edad es mayor a 18 antes de crear el objeto.

Código (java) [Seleccionar]
int edad = 19;
if(edad >= 18) {
     Objeto obj = new Objeto(edad);
}
else{
     System.out.println("No puedes crear el objeto");
}

Baal_30

Ya, lo había pensado. Y parece una manera sencilla y muy funcional, pero me preguntaba si había otra forma o si se podía hacer desde el mismo constructor.

Pero gracias por la respuesta ¡! Con el código se ve más claro :)
«La suerte es el cuidado de los detalles». -Winston Churchill

Usuario Invitado

#3
Al llamar al constructor, éste creará el objeto, independientemente si los parámetros pasados cumplan o no una determinada condición o serie de condiciones.

Una manera alterna a lo que deseas hacer es crear una instancia a través de un método, como lo hacemos con el patrón Factory:

Código (java) [Seleccionar]
public static Objeto createObjeto(int age) {
   if (age >= 18)
       return new Objeto(age);
   return null;
}


Obviamente el constructor debe ser privado para evitar que se creen objetos de la manera tradicional.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

Baal_30

Entonces ese método estaría en la clase del objeto, y lo llamarías desde el main en vez de llamar al constructor ¿no?
«La suerte es el cuidado de los detalles». -Winston Churchill

Usuario Invitado

#5
Sí. O puede ser en una fábrica, pero si no entiendes el patrón factory hazlo así nomás.

EDITO: Un ejemplo de una factoría muy sencilla:

Código (java) [Seleccionar]
public class SomeFactory {
   
   public ObjectOne createObjectOne(int age) {
       return (age >= 18) : new ObjectOne(age) ? null;
   }
   
   public ObjectTwo createObjectTwo(boolean state) {
       return (state) : new ObjectTwo() ? null;
   }
   
   public ObjectThree createObjectThree(double price) {
       return (price <= 50.9) : new ObjectThree(price) ? null;
   }
}


Y aquí uno de tus objetos:

Código (java) [Seleccionar]
public class ObjectoOne {
   private int age;
   // otras propiedades
   
   public ObjectOne() {}
   public ObjectOne(int age) { this.age = age; }
   // getters y setters
   
}


Puedes ver el patrón Abstract Factory con un ejemplo funcional en mi post sobre Patrones de diseño.

Saludos.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

Baal_30

Ummm entiendo... ¿Se suele utilizar mucho lo del patrón factory? Es la primera vez que lo leo :/

Y funcionaria igual con más argumentos ¿no? simplemente se harían las comprobaciones pertinentes y ya está...

Y el constructor sin parámetros tiene que ponerse siempre aunque no lo vayas a utilizar ¿?
«La suerte es el cuidado de los detalles». -Winston Churchill

Usuario Invitado

1) Los patrones de diseño se usan de acuerdo a las necesidades del proyecto.
2) Los argumentos no tienen nada que ver con el funcionamiento de la factoría. Pero sería mejor un objeto que englobe todos esos argumentos que pasarlos uno a uno a la factoría. La factoría tiene como único propósito crear objetos de X tipo para su uso final.
3) Por compatibilidad sí. Aunque si estás 100% seguro que nunca utilizarás el constructor por defecto no lo tienes que implementar.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

Baal_30

Que grande Gus, como siempre, muchas gracias por contestar :)
«La suerte es el cuidado de los detalles». -Winston Churchill