【问题标题】:Recursive Set method in Java - Default variable a la Perl?Java中的递归Set方法-Perl的默认变量?
【发布时间】:2011-04-30 13:24:41
【问题描述】:

我唯一使用过的其他语言是 Perl,这是我在 OO 编程方面的第一次尝试。我觉得我正在接近这一切都是错误的。问题之一可能是我尝试像编写非 OO Perl 一样编写 OO Java。谁能建议一种方法来优雅地完成我在下面的代码 sn-p 中尝试完成的事情?

注意:???在我的代码中是我想要使用默认对象的地方。

公共类 Var {
    私人双var1;

    public Var (double PassedVar1) { //创建新对象的方法
        var1 = ???.SetVar1(PassedVar1);
    }

    公共无效SetVar1(双PassedVar){
        if (PassedVar > 0) { //确保我们分配了一个正值
            var1 = PassedVar;
        }
        else { //强制用户输入新值
            System.out.print("\n设置变量失败。" +
            "请输入一个大于零的数字:");
            扫描仪扫描 = 新的扫描仪(System.in);
            PassedVar = scan.nextDouble();
            var1 = ???.SetVar1(PassedVar);//递归调用以确保肯定
        }
    }
}

【问题讨论】:

    标签: java oop


    【解决方案1】:

    您要查找的单词是this(即this.SetVar1(...)),但在Java 中这不是必需的。您可以在Var 的任何子类的Var 的任何非静态成员中使用SetVar1(...)

    毫无疑问,其他人会就用 Java 完成任务的更好方法提供建议,所以我不会回答这部分问题。

    【讨论】:

      【解决方案2】:

      经过一点重构和修复,您的代码将变成这样,

      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
              }
          }
      }
      

      好吧,因为有批评,我才敢大改。

      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;
          }    
      }
      

      通过这种方式,调用代码应该检查null 并在遇到null 时做任何它喜欢做的事情。无论如何,下面是确保输入 double 有效然后实例化 Var 的代码 sn-p。

               ...
               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);
               ...
      

      干杯。

      【讨论】:

      • 我会使用 while 循环而不是对 setVar1 的递归调用,以便大量错误输入不会导致 StackOverflow。
      • 我会提供一个调用 this(-1) 的无参数构造函数。这意味着您可以轻松创建一个 Var,并且系统会提示用户输入。
      • @Gabe:当然,我假设编写递归代码的主要原因是为了编写递归。对我来说,这似乎是一种任务。就是这个原因,我没怎么改。
      • @Syntax:那么当您能够创建Var 实例时,情况就完全不同了。顺便说一句,如何提示用户输入?
      猜你喜欢
      • 2018-02-06
      • 1970-01-01
      • 2014-04-24
      • 2011-08-23
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多