2010-10-26 51 views
0

我有任何經驗的唯一其他語言是Perl &這是我在OO編程中的第一個破解。我覺得我接近這一切都是錯誤的。其中一個問題可能是我試圖編寫OO Java,比如我編寫了非OO Perl代碼。任何人都可以提出一種方法來優雅地完成我在下面的代碼片段中完成的任務嗎?Java中的遞歸集方法 - 默認變量a Perl?

注意:???在我的代碼中,我想使用默認對象。

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

回答

2

你要找的字是this(即this.SetVar1(...)),但是在Java中,這不是必要的。您可以在任何Var的子類的Var的任何非靜態成員中使用SetVar1(...)

毫無疑問,其他人會提供更好的方式來完成您的Java任務的建議,所以我不會回答問題的這一部分。

0

您的代碼將成爲這個,有點重構和固定,

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的代碼片段。

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

乾杯。

+0

我會使用'while'循環而不是遞歸調用'setVar1',這樣一大系列錯誤輸入不會導致StackOverflow。 – Gabe 2010-10-26 04:50:05

+0

我會提供一個無參數構造函數,它也調用此(-1)。這將意味着您可以輕鬆創建Var,並提示用戶輸入。 – Syntax 2010-10-26 05:39:22

+0

@Gabe:當然,我假設編寫遞歸代碼的主要原因是爲了編寫遞歸。這對我來說看起來像是一種任務。那就是原因,我沒有太多改變。 – 2010-10-26 06:18:19