最初に、ヒントとして、メソッド ヘッダーを追加すると、メソッドが何をしようとしているのかがわかるようになると便利です。別名、仕様を見ると、メソッドの多くは「どれだけ知っているか...」を要求するため、メソッドはすぐに何かを出力するのではなく、数値を返す必要があります (コーディングを開始したときに同じ間違いを犯しました)。
メソッド内でこれらの数値を出力しています (これはデバッグには役立ちますが、完成品がすべきことではありません)。int を返し、その整数を RunSugarBowl に出力できます (以下を参照)。
そのために必要なことの一般的な枠組みを説明し、役立つコメントをいくつか追加しました。あなたは最初からよくやった。さらに問題がある場合は、コメントで質問してください。
public class SugarBowl {
private int totalCapacity;
private int availableSpace;
private int spoonSize;
private int occupiedSpace;//starts at 0, because there's nothing in the bowl.
/**
* Constructor for the sugar bowl.
* @param totalCapacity The total capacity of the bowl.
*/
public SugarBowl (int totalCapacity){
this.totalCapacity = totalCapacity; //set the totalCapacity for the bowl
availableSpace=totalCapacity;
spoonSize = totalCapacity/20;//arbitrary size
occupiedSpace = 0;
}
/**
* Shows how much sugar can fit in a spoon.
* @return The size of the spoon
*/
public int spoon(){
return spoonSize;
}
/**
* Returns amount of sugar in the bowl.
* @return The amount of occupied space
*/
public int occupied(){
return occupiedSpace;
}
/**
* Removes the amount of sugar based on the
* number of scoops passed into it.
* @param numberOfScoops The number of scoops
* @return The amount of sugar removed
*/
public int scoops (int numberOfScoops){
int possibleAmountTaken = numberOfScoops * spoonSize;
int actualAmountTaken = 0;
//Think about sugar, even if there is less sugar than the spoon size,
//can a spoon still remove that amount?
//aka the only time 0 sugar should be taken is when there is 0 sugar in the bowl
if (possibleAmountTaken<=occupiedSpace){
actualAmountTaken = possibleAmountTaken;
}
else{
//there may still be sugar, just not enough for every scoop, you still have to remove it
//actualAmountTaken = ???
}
occupiedSpace = occupiedSpace - actualAmountTaken;
//what about availableSpace?
//availableSpace = ???
return actualAmountTaken;
}
/**
* Adds the specified amount of sugar to the bowl.
*
* @param addedAmount The amount of sugar added to the bowl
* @return The overflow amount of sugar or 0 if there was no overflow
*/
public int addSugar (int addedAmount){
int overflow = 0;
if (addedAmount>availableSpace){
overflow = addedAmount-availableSpace;
//your bowl is going to be full, what happens to occupiedSpace and availableSpace?
//availableSpace = ???
//occupiedSpace = ???
}
else{
//overflow is already 0 so you don't have to do anything with it
//update availableSpace and occupiedSpace
//availableSpace = ???
//occupiedSpace = ???
}
return overflow;
}
}
上記の主な例では:
public class RunSugarBowl {
public static void main(String[] args) {
SugarBowl one = new SugarBowl(200);
System.out.println("Sugar overflow: " + Integer.toString(one.addSugar(300))); //once working correctly should print out 100 for the overflow
System.out.println("Occupied size is : "+ one.occupied());
}
}
アップデート
this.totalCapacity を使用する理由は、次のコード行のためです。
public class SugarBowl {
private int totalCapacity; //totalCapacity for this object; aka this.totalCapacity refers to this variable
//..
public SugarBowl (int totalCapacity){ // <-- totalCapacity passed in
this.totalCapacity = totalCapacity; //this.totalCapacity is setting the totalCapacity for this instance of the object to the value passed in
//..
コンストラクターが "totalCapacity" という変数で渡されていることに注意してください。さらに、クラスには totalCapacity という独自の内部変数もあります。「this」キーワードを使用しない比較可能なコードは次のとおりです。
public class SugarBowl {
private int bowlTotalCapacity; //totalCapacity for this object
//..
public SugarBowl (int totalCapacity){
bowlTotalCapacity = totalCapacity;
//..
以前に totalCapacity を使用していた場所を初期化した後は、bowlTotalCapacity に変更する必要があります。this.totalCapacity を使用して、このクラス内の totalCapacity を参照する方がはるかに簡単です。詳細については、http: //docs.oracle.com/javase/tutorial/java/javaOO/thiskey.htmlを参照してください。
技術的には、最初にオブジェクトを構築した後は実際に totalCapacity を再度使用することはありませんが、この部分を含めない場合に起こる奇妙なことを確認したい場合は、次のコードで何が起こるかを理解してください。
public class ThisExample {
private int wrongExample = 0;
private int thisExample = 0;
public ThisExample (int wrongExample, int thisExample){
wrongExample = wrongExample;
this.thisExample = thisExample;
}
public int getThisExample(){
return thisExample;
}
public int getWrongExample(){
return wrongExample;
}
}
以下を実行すると、理解が深まる場合があります。
public class ThisExampleMain {
public static void main(String[] args) {
ThisExample ts = new ThisExample(50, 50);
//you want this to be 50 but it ends up being 0:
System.out.println("Wrong: " + ts.getWrongExample());
//this returns the correct answer:
System.out.println("Right: " + ts.getThisExample());
}
}