web-dev-qa-db-fra.com

Java: Comment un constructeur peut-il renvoyer une valeur?

$ cat Const.Java 
public class Const {
    String Const(String hello) {
        return hello; 
 }
 public static void main(String[] args) {
     System.out.println(new Const("Hello!"));
 }
}
$ javac Const.Java 
Const.Java:7: cannot find symbol
symbol  : constructor Const(Java.lang.String)
location: class Const
  System.out.println(new Const("Hello!"));
                     ^
1 error
15
hhh

Ce que vous avez défini n'est pas réellement un constructeur, mais une méthode appelée Const. Si vous changiez votre code pour quelque chose comme ça, ça marcherait:

Const c = new Const();
System.out.println( c.Const( "Hello!" ) );

Si aucun constructeur spécifique n'est explicitement défini, le compilateur crée automatiquement un constructeur sans argument.

24
Ash

Les constructeurs ne peuvent pas renvoyer de valeur; ils renvoient l'objet construit, pour ainsi dire.

Vous obtenez une erreur car le compilateur recherche un constructeur qui prend une chaîne en tant qu'argument. Depuis que vous avez fait not déclarer un constructeur, le seul constructeur disponible est le constructeur par défaut qui ne prend aucun argument.

Pourquoi dis-je que vous n'avez pas déclaré de constructeur? Car dès que vous déclarez une valeur/type de retour pour votre méthode, ce n'est plus un constructeur, mais une méthode standard.

Depuis la Documentation Java :

Une classe contient des constructeurs qui sont invoqué pour créer des objets à partir du fichier plan de classe. Constructeur les déclarations ressemblent à la méthode déclarations - sauf qu'ils utilisent le nom de la classe et aucun retour type.

Si vous définissez ce que vous essayez d’atteindre, une personne pourra peut-être vous dire comment atteindre cet objectif.

22
scherand

En fait, le constructeur d'une classe Java ne peut pas retourner une valeur, il doit être sous la forme suivante

public class Test {
 public Test(/*here the params*/) {
   //this is a constructor
   //just make some operations when you want to create an object of this class
 }
}

vérifiez ces liens http://leepoint.net/notes-Java/oop/constructors/constructor.htmlhttp://Java.Sun.com/docs/books/tutorial/ Java/javaOO/constructors.html

9
Mohammad Kotb

Un constructeur ne peut pas renvoyer de valeur car un constructeur retourne implicitement l'ID de référence d'un objet. Etant donné qu'un constructeur est également une méthode, une méthode ne peut pas renvoyer plus d'une valeur. Nous disons donc explicitement que le constructeur n'a pas de valeur de retour.

5
Ajendra Chaurasia

Beaucoup de bonnes réponses déjà. Je voudrais juste ajouter que, si vous voulez obtenir un code retour distinct de l'objet lui-même à la suite de l'appel d'un constructeur, vous pouvez envelopper le constructeur dans un factory method qui, lors de la création, pourrait par exemple effectuer une validation de l'objet construit et retourne une boolean en fonction du résultat.

2
amphibient

Le constructeur ne peut pas renvoyer de valeur. C'est final. C'est le même sens - il ne peut pas avoir de type de retour et c'est pourquoi vous obtenez l'erreur de compilation. Vous pouvez dire que la valeur de retour est toujours implicitement l'objet créé par le constructeur.

1
Bozhidar Batsov

Un constructeur ne peut pas avoir une valeur de retour comme une fonction "normale". Il est appelé lorsqu'une classe de la classe en question est créée ..__ Il est utilisé pour effectuer l'initialisation de cette instance.

1
Venemo

Je pense que la meilleure façon de produire l’effet souhaité serait la suivante:

public class Const {

    private String str;

    public Const(String hello) {
        str = hello; 
    }

    public String toString() {
        return str;
    }

    public static void main(String[] args) {
        System.out.println(new Const("Hello!"));
    }
}

Ceci remplace la méthode public String Const() que vous avez utilisée précédemment et en remplaçant la méthode public String toString() par Object (dont toutes les classes Java héritent), la valeur String de l'objet est imprimée correctement lorsque vous souhaitez imprimer l'objet, de sorte que votre méthode principale reste inchangée. 

0
Edd

Pour renvoyer une valeur d'un constructeur, il suffit de passer un tableau en tant que paramètre ..__ Pour illustrer le principe

Test() {
    Boolean[] flag = new Boolean[1];
    flag[0] = false;
    new MyClass(flag);
    System.out.println(flag[0]); // Will output 'true'
}

class MyClass {
    MyClass(Boolean[] flag) {
        // Do some work here, then set flag[0] to show the status
        flag[0] = true;
    }
}
0
Adrian Powell
/************************************************
   Put the return value as a private data member, which gets
   set in the constructor. You will need a public getter to
   retrieve the return value post construction
******************************************************/

class MyClass
{
   private Boolean boolReturnVal;

   public Boolean GetReturnVal() { return(boolReturnVal); }
   MyClass() // constructor with possibly args
    {
       //sets the return value boolReturnVal
    }

 public static void main(String args[])
 {
     MyClass myClass = new MyClass();

    if (myClass.GetReturnVal())
    {
       //success
    }

 }

}

0
Patrick
public class Const {
  private String myVar;

  public Const(String s) {
    myVar = s; 
  }

  public String getMyString()
  {
      return myVar;
  }

  public static void main(String[] args) {
    Const myConst = new Const("MyStringHere"); 
    System.out.println(myConst.getMyString());
  }
}
0
Arthur