2013-11-23 6 views
2

Итак, я делаю класс умирающего, который может создавать и катить кубик, возвращать значение и размер. Я пытаюсь выяснить, как сообщить программе, сколько из них было создано, чтобы у меня был ответ, отличающийся от того, сколько из них существует. IE Я хочу, чтобы ответ от printDie был Die Value: 5, если есть только один штамп, и значение Die 1: 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 дает мне исключение nullpointer. Die One = new Die(); One.rollDie(); One.getDieValue(); Исключение в теме "main" java.lang.NullPointerException – Taylor

+0

Хотя это должен быть другой вопрос, но я отвечу вам. У вас есть 2 конструктора. Один принимает значение, чтобы установить 'myDieSides', а другой - нет. Попробуйте вызвать другое, которое принимает значение. 'Die One = new Die (6);' – SudoRahul

+0

В расширенной версии теста у меня три штампа, один из них - новый Die (5) и новый Die (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

Смежные вопросы