2013-11-23 81 views
2

因此,我正在製作一個可以創建和擲骰子的模具類,並返回值和大小。我試圖弄清楚如何告訴程序有多少人已經創建好了,這樣我就可以根據有多少人有不同的迴應。 IE我希望printDie的響應是Die Value:如果只有一個die,則爲5;如果有多個,則爲Die 1 Value:5。計算現有對象的數量

這是我的代碼到目前爲止。

package com.catalyse.die; 

import java.util.Random; 

public class Die 
{ 
    // instance variables 
    private int myDieValue; 
    private int myDieSides; 
    private Random myRandom; 

    // Dice Class Constructors 


    public Die() 
    { 
     this.myDieValue = 1; 
     this.myDieSides = 4; 
    } 


    public Die(int numSides) 
    { 
     if ((numSides < 4) || (numSides > 100)) { 
      System.out.println("Error! You cannot have more than 100 sides or less than four!"); 
      System.exit(0); 
     } 
     else { 
      myDieSides = numSides; 
     } 
    } 

    // getter methods 

    public int getDieSides() 
    { 
     return myDieSides; 
    } 


    public int getDieValue() 
    { 
     return myDieValue; 
    } 

    // setter methods 

    private void setDieSides(int newNumSides) 
    { 
     myDieSides = newNumSides; 
    } 


    public void rollDie() 
    { 
     Random rand = new Random(); 
     int i = (rand.nextInt(myDieSides) + 1); 
     myDieValue = i; 
    } 

public void printDie(int dieNum) 
{ 
    if (dieNum == 1) { 
     System.out.println("Die Value: "+myDieValue); 
    } 
    else { 
     System.out.println("Die "+dieNum+" Value: "+myDieValue); 
    } 
} 

}

+0

注:所以通過使用靜態字段,如果一個被刪除的次數不會反映這種變化Java沒有deconstructors。 – Obicere

+0

您提供的信息非常好,但我必須問你,你究竟是什麼意思*被刪除*?由於沒有析構函數,所以沒有刪除。我想你的意思是說,可能收集垃圾? :) – SudoRahul

回答

2

你可以在你的類中有靜態字段,它可以在構造函數中一直增加。之所以應該是static是因爲static字段由類的所有實例共享,因此不會爲您創建的每個實例創建該字段的本地副本。

private static int counter = 0; 
public Die() 
{ 
    counter++; 
    // Other stuffs 
} 
// Have a getter method for the counter so that you can 
// get the count of instances created at any point of time 
public static int getCounter() { 
    return counter; 
} 

然後你就可以調用上面的方法在調用方法這樣

void someMethodInAnotherClass() { 
    int instanceCount = Die.getCounter(); // You need to call static method using the Class name 
    // other stuffs. 
} 
+0

真棒,如此相同的代碼,新的問題。當我嘗試和測試課堂時,Roll die給了我一個nullpointerexception。 Die One = new Die(); One.rollDie(); One.getDieValue(); 線程「main」中的異常java.lang.NullPointerException – Taylor

+0

雖然這應該是另一個問題,但我會爲您解答。你有2個構造函數。一個值需要設置'myDieSides',另一個則不需要。嘗試打電話給其他人,這需要一個價值。 '模具一=新模(6);' – SudoRahul

+0

在擴展版本的測試中,我有三個模子,一個是新模子(5)和新模子(99),我試過每一個,他們都扔相同例外。 – Taylor

2

使用的靜態成員,這是一個 '類' 變量,而不是一個 '實例' 變量:

private static int count = 0; 

在構造:

public Die() 
{ 
    count++; 
    this.myDieValue = 1; 
    this.myDieSides = 4; 
} 

和一個吸氣劑:

public static int getCount() { 
    return count; 
} 
+1

非常感謝您的幫助,正是我所需要的。 – Taylor

0

使用一個靜態變量

public class Die{ 
    static int dieCount = 0; 

    public Die(){ 
     dieCount++; 
    } 
} 

創建Die對象的時候,計數會增加

public static void main(String[] args){ 
    Die die1 = new Die(); 
    Die die2 = new Die(); 

    int count = Die.dieCount; 

} 
0

看到的就是我在我的應用程序計數目標的解決方案

import java.util.Map; 
import java.util.TreeMap; 

public abstract class ObjectCounter { 

    private static Map<String, Long> classNameCount = new TreeMap<String, Long>(); 

    public ObjectCounter() { 
     String key = this.getClass().getName(); 
     if (classNameCount.containsKey(key)) { 
      classNameCount.put(key, classNameCount.get(key) + 1); 
     } else { 
      classNameCount.put(key, 1L); 
     } 
    } 

    public static <T extends ObjectCounter> long getCount(Class<T> c) { 
     String key = c.getName(); 
     if (classNameCount.containsKey(key)) { 
      return classNameCount.get(key); 
     } else { 
      return 0; 
     } 
    } 

    public static long totalObjectsCreated() { 
     long totalCount = 0; 

     for (long count : classNameCount.values()) { 
      totalCount += count; 
     } 

     return totalCount; 
    } 

} 

現在擴展ObjectCounter類

見下

package com.omt.factory; 

public class Article extends ObjectCounter { 

} 

現在所有其他類延長物品類

package com.omt.factory; 

public class Bio extends Article { 

} 

現在,這裏是我們的主類

package com.omt.factory; 

public class Main { 

    public static void main(String... a) { 
     Bio b = new Bio(); 
     Bio b1 = new Bio(); 
     Bio b2 = new Bio(); 
     Bio b3 = new Bio(); 
     Bio b4 = new Bio(); 
     com.omt.temp.Bio bio = new com.omt.temp.Bio(); 

     // Total Objects are created 
     System.out.println("Total Objects Created By Application :" + ObjectCounter.totalObjectsCreated()); 
     // Get Number Of Objects created for class. 
     System.out.println("[" + com.omt.temp.Bio.class.getName() + "] Objects Created :" 
       + ObjectCounter.getCount(com.omt.temp.Bio.class)); 
     System.out.println("[" + Bio.class.getName() + "] Objects Created :" + ObjectCounter.getCount(Bio.class)); 
     System.out.println("[" + Maths.class.getName() + "] Objects Created :" + ObjectCounter.getCount(Maths.class)); 

    } 

} 

From this article