2014-03-31 55 views
-1

我想創建一個沒有參數的構造函數的形式爲我在下面創建的構造函數。我提供了我試圖編寫這個構造函數的嘗試。它是否正確?沒有參數形式的構造函數

/** 
* Default Constructor for Testing 
*/ 
public void extractTokens(Scanner scanner) 
    throws IOException, FileNotFoundException 
{ 
    //extracts tokens from the text file 
    File text = new File("E:/LEWIS BC 2/java project/project 1 part 3/items_all.txt"); 

    String toolName = scanner.next(); 
    String itemCode = scanner.next(); 
    String power = scanner.next(); 
    String timesBorrowed = scanner.next(); 
    String onLoan = scanner.next(); 
    String cost = scanner.next(); 
    String weight = scanner.next(); 

    extractTokens(scanner); 

    // System.out.println(parts.get(1)); // "en" 
} 


/** 
* Creates a collection of tools to be stored in a tool list 
*/ 
public Shop( String toolName, 
       int power, 
       int timesborrowed, 
       boolean rechargeable, 
       int itemCode, 
       int cost, 
       double weight, 
       int toolcount, 
       boolean onLoan ) 
{ 
    toolsList = new ArrayList<Tool>(); 
    toolName = new String(); 
    power = 0; 
    timesborrowed = 0; 
    rechargeable = true; 
    itemCode = 001; 
    cost = 100; 
    weight = 0.0; 
    toolCount = 0; 
    onLoan = true; 
} 

/** 
* Default Constructor for Testing 
*/ 
public Shop() { 
    // initialise instance variables 
    toolName = "Spanner"; 
    itemCode = 001; 
    timesBorrowed = 0; 
    power = 0; 
    onLoan = true; 
    rechargeable = true; 
    itemCode = 001; 
    cost = 100; 
    weight = 0.0; 
    toolCount = 0; 
} 
+0

顯示實例變量的聲明。 – Christian

+0

您需要在分配值時使用'this'關鍵字。例如'this.toolName =「Spanner」' –

+2

我建議你通過這個東西的基本教程通過你的方式。有許多概念你都無法理解。 –

回答

0

是的,這是正確的,假設所有的變量都是正確的。你可以有這樣的構造:

public Shop() {} 

就拿一個骰子類:

private num_sides; 
public Dice(int sides) { this.num_sides = sides; } 
public Dice() { this.num_sides = 6; } //default 

完美的罰款。

+1

大寫常量並使用'this.varName'作爲成員變量。可能應該在這裏遵循這種形式。 –

+1

@NathanielFord在實例化對象之後'NUM_SIDES'會是一個常量,我最初並沒有包含'this.',因爲它會混淆他。 – Shahar

+1

@Shahar最好用'final'關鍵字表示,而不是違反正常的命名約定。 –

1

一旦你引入了第二個構造函數,那麼你有兩個代碼可以用來初始化一個對象的路徑。如果您不小心,可以引入不一致性,以便根據對象的創建方式設置不同的值。

如果您發佈的代碼引入第二個構造函數似乎沒有必要,只會爲您創建問題。爲測試創建對象的代碼在測試中會更好,因此它可以與主代碼保持分離。

在確實需要其他方法來初始化對象的情況下,有一種稱爲構造器鏈的通用模式,旨在消除不一致初始化的機會。有了這種方法,就有了一個主構造函數和一個或多個輔助構造函數。

// primary constructor 
public Foo(String p1, String p2, String p3) { 
    this.p1 = p1; 
    this.p2 = p2; 
    this.p3 = p3; 
} 

// auxiliary constructor 
public Foo() { 
    this("firstDefault", "secondDefault", "thirdDefault"); 
} 

主構造總是被調用,其他構造函數調用this()各種參數。

+0

爲什麼?你能提供一些理由嗎? –

+0

不會*更好*只是更清潔。 – Shahar

+0

@莎哈我不同意。這種方法的問題是,如果由於某種原因不起作用,有兩個地方需要檢查 - (1)是否將正確的值放在無參數構造函數的括號中,(2)是否分配了一切都在「大」構造函數中正確。 「清理」將是在無參數構造函數中直接執行任務的簡單方法。可讀性遠比聰明重要。 –

2

你犯了很多錯誤。首先,字段需要存在於類級作用域中。

public void extractTokens(Scanner scanner) 
    throws IOException, FileNotFoundException 
{ 
    //extracts tokens from the text file 
    File text = new File("E:/LEWIS BC 2/java project/project 1 part 3/items_all.txt"); 

    String toolName = scanner.next(); 
    String itemCode = scanner.next(); 
    String power = scanner.next(); 
    String timesBorrowed = scanner.next(); 
    String onLoan = scanner.next(); 
    String cost = scanner.next(); 
    String weight = scanner.next(); 

    extractTokens(scanner); 

    // System.out.println(parts.get(1)); // "en" 
} 

這種方法基本上都沒有,你宣佈了很多方法,範圍變量,它掉下來的範圍,因此被下一輪的垃圾收集的消耗。你有其他方法,使這完全相同的錯誤。如果您需要在字段上進行工作,則需要參閱這些字段。通過說String toolname = scanner.next()您正在聲明一個變量,該變量持有對METHOD類型的String類型對象的引用,該值等於scanner.next()的值。你想要做的是在CLASS範圍上聲明變量,然後通過引用它們來處理它們。我強烈建議您使用this關鍵字來限定您的參考資料,從而可以引用您當前的對象實例。

至於是否你無參數的public構造函數寫正確,答案是,因爲你已經聲明沒有返回類型的類的成員,具有相同的名稱作爲類,不帶參數並與public知名度。這裏有一個警告,因爲你的代碼有100%的機會沒有真正做你想做的事情。

1

做這樣的

/** 
* Creates a collection of tools to be stored in a tool list 
*/ 
public Shop(String toolName, int power,int timesborrowed,boolean rechargeable, 
     int itemCode,int cost,double weight,int toolcount,boolean onLoan) { 
    this.toolsList = new ArrayList<Tool>(); 
    this.toolName = toolName; 
    this.power = power; 
    this.timesborrowed = timesborrowed; 
    // ... and so on .. 
} 

/** 
* Default Constructor for Testing 
*/ 
public Shop(){ 
    // Call the previous defined constructor 
    this("Spanner", 0, 0, ... and so on ...) 
}