2010-10-26 2 views
0

La seule autre langue avec laquelle j'ai de l'expérience est Perl & c'est ma première expérience de programmation OO. J'ai l'impression que je m'approche de tout cela. Un des problèmes est probablement moi essayant de coder OO Java comme j'ai codé non-OO Perl. Quelqu'un peut-il suggérer un moyen d'accomplir gracieusement ce que j'essaie d'accomplir dans l'extrait de code ci-dessous?Méthode Recursive Set en Java - La variable par défaut est un Perl?

Note: Le ??? dans mon code est l'endroit où je voudrais utiliser l'objet par défaut.

public class Var { 
    private double var1; 

    public Var (double PassedVar1) { //method to create new object 
     var1 = ???.SetVar1(PassedVar1); 
    } 

    public void SetVar1 (double PassedVar) { 
     if (PassedVar > 0) { //make sure we're assigning a positive value 
      var1 = PassedVar; 
     } 
     else { //force user to input a new value 
      System.out.print("\nFailed to set var. " + 
      "Please enter a number greater than zero: "); 
      Scanner scan = new Scanner (System.in); 
      PassedVar = scan.nextDouble(); 
      var1 = ???.SetVar1(PassedVar);//recurse call to assure positive 
     } 
    } 
}

Répondre

2

Le mot que vous cherchez est this (à savoir this.SetVar1(...)), mais en Java ce n'est pas nécessaire. Vous pouvez simplement utiliser SetVar1(...) dans n'importe quel membre non statique de Var de toutes les sous-classes de Var. Sans aucun doute, d'autres vous donneront des conseils sur une meilleure façon d'accomplir votre tâche en Java, donc je ne répondrai pas à cette partie de la question.

0

Votre code deviendrait cela, après un peu refactoring et la fixation,

public class Var { 
    private double var1; 

    public Var (double passedVar1) { //method to create new object 
     setVar1(passedVar1); // You just need to invoke setVar1() by passing the argument 
    } 

    public void setVar1 (double passedVar1) { 
     if (passedVar1 > 0) { //make sure we're assigning a positive value 
      var1 = passedVar1; 
     } else { //force user to input a new value 
      System.out.print("\nFailed to set var. " + 
            "Please enter a number greater than zero: "); 
      Scanner scan = new Scanner (System.in); 
      passedVar1 = scan.nextDouble(); 
      setVar1(passedVar1); //recurse call to assure positive 
     } 
    } 
} 

Bon à cause des critiques, j'ose changer radicalement.

public class Var { 

    private double var1; 

    private Var(double var1) { 
     this.var1 = var1; 
    } 

    public static final Var getVar(double var1) { 
     return (var1 > 0) ? new Var(var1) : null; 
    }  
} 

De cette façon, le code d'appel doit vérifier null et faire ce qu'il aime à rencontrer null. Quoi qu'il en soit, voici l'extrait de code qui vérifie que l'entrée double est valide, puis instancie Var.

  ... 
     double passedVar1 = 0D; 
     do { 
      System.out.print("\nFailed to set var. " + 
            "Please enter a number greater than zero: "); 
      Scanner scan = new Scanner (System.in); 
      passedVar1 = scan.nextDouble(); 
     } while (passedVar1 < 0) 

     Var var = Var.getVar(passedVar1); 
     ... 

Cheers.

+0

Je voudrais utiliser une boucle 'while' au lieu d'un appel récursif à' setVar1' de sorte qu'une énorme série de mauvaises entrées ne provoque pas un StackOverflow. – Gabe

+0

Je fournirais un constructeur sans-args qui appelle aussi (-1). Cela signifie que vous pouvez facilement créer un Var et que l'utilisateur sera invité à saisir l'entrée. – Syntax

+0

@Gabe: Bien sûr, je suppose que la raison principale pour écrire le code récursif est pour l'écriture de récursion. Cela ressemble à une sorte de devoir pour moi. C'est la raison, je n'ai pas beaucoup changé. –

Questions connexes