2293 votos

¿Cómo puedo llamar a un constructor desde otro en Java?

Es posible llamar a un constructor desde otro (dentro de la misma clase, no de una subclase)? Si sí, ¿cómo? Y lo que podría ser la mejor manera para llamar a otro constructor (si hay varias maneras de hacerlo)?

3020voto

Jon Skeet Puntos 692016

Sí, es posible:

public class Foo
{
    private int x;

    public Foo()
    {
        this(1);
    }

    public Foo(int x)
    {
        this.x = x;
    }
}

Cadena a un particular constructor de la superclase en lugar de uno en la misma clase, el uso super en lugar de this. Tenga en cuenta que sólo puedes encadenar a un constructor, y tiene que ser la primera instrucción en el cuerpo del constructor.

EDIT: Ver también esta relacionada con la pregunta, que es sobre C#, pero donde se aplican los mismos principios.

252voto

Josh Puntos 5454

Utilizando this(args). El patrón preferido es trabajar desde el más pequeño constructor a la más grande.

public class Cons {

 public Cons() {
  // A no arguments constructor that sends default values to the largest
  this(madeUpArg1Value,madeUpArg2Value,madeUpArg3Value);
 }

 public Cons(int arg1, int arg2) {
  // An example of a partial constructor that uses the passed in arguments
  // and sends a hidden default value to the largest
  this(arg1,arg2, madeUpArg3Value);
 }

 // Largest constructor that does the work
 public Cons(int arg1, int arg2, int arg3) {
  this.arg1 = arg1;
  this.arg2 = arg2;
  this.arg3 = arg3;
 }
}

También puede utilizar una más recomendado recientemente enfoque de valueOf o simplemente "de":

public class Cons {
 public static Cons newCons(int arg1,...) {
  // This function is commonly called valueOf, like Integer.valueOf(..)
  // More recently called "of", like EnumSet.of(..)
  Cons c = new Cons(...);
  c.setArg1(....);
  return c;
 }
} 

Para llamar a un super clase, use super(asdf). La llamada a super debe ser la primera llamada en el constructor o se producirá un error de compilador.

210voto

Christian Fries Puntos 3010

[Nota: sólo quiero agregar un aspecto, que no me vea en el otro responde: cómo superar las limitaciones de la exigencia de que este(a) tiene que estar en la primera línea).]

En Java a otro constructor de la misma clase puede ser llamado desde un constructor a través de this(). Nota sin embargo que this tiene que estar en la primera línea.

public class MyClass {

  public MyClass(double argument1, double argument2) {
    this(argument1, argument2, 0.0);
  }

  public MyClass(double argument1, double argument3, double argument3) {
    this.argument1 = argument1;
    this.argument2 = argument2;
    this.argument3 = argument3;
  }
}

Que this tiene que aparecer en la primera línea se ve como una gran limitación, pero se pueden construir los argumentos de otros constructores a través de métodos estáticos. Por ejemplo:

public class MyClass {

  public MyClass(double argument1, double argument2) {
    this(argument1, argument2, getDefaultArg3(argument1, argument2));
  }

  public MyClass(double argument1, double argument3, double argument3) {
    this.argument1 = argument1;
    this.argument2 = argument2;
    this.argument3 = argument3;
  }

  private static double getDefaultArg3(double argument1, double argument2) {
    double argument3 = 0;

    // Calculate argument3 here if you like.

    return argument3;

  }

}

39voto

Kaamel Puntos 31

Cuando tengo que llamar a otro constructor desde dentro el código (no en la primera línea), yo suelo usar un método auxiliar como este:

class MyClass {
   int field;


   MyClass() {
      init(0);
   } 
   MyClass(int value) {
      if (value<0) {
          init(0);
      } 
      else { 
          init(value);
      }
   }
   void init(int x) {
      field = x;
   }
}

Pero más a menudo trato de hacerlo de la otra manera alrededor llamando al más complejo de los constructores de las más simples en la primera línea, en la medida de lo posible. Para el ejemplo anterior

class MyClass {
   int field;

   MyClass(int value) {
      if (value<0)
         field = 0;
      else
         field = value;
   }
   MyClass() {
      this(0);
   }
}

1voto

janaka Puntos 11

Sí, es

nos puede llamar al constructor desde otro constructor uso de "this"

debe tener diferente tipo de parámetro de constructores

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X