计算方法调用的次数?

时间:2013-12-06 15:47:03

标签: java

我正在尝试计算调用方法的次数。我目前有3个班,Circle.java,Picture.java和PictureTest.java

在circle.java中有;

public class Circle
{
    private int diameter;
    private int xPosition;
    private int yPosition;
    private String color;
    private boolean isVisible;
    private int instances;

    /**
     * Create a new circle at default position with default color.
     */
    public Circle()
    {
        diameter = 30;
        xPosition = 20;
        yPosition = 60;
        color = "blue";
        isVisible = false;
        instances = 0;
        instances++;
        System.out.println(instances);
    }

在Picture.java中:

public class Picture
{
    private Circle sun;

    /**
     * Constructor for objects of class Picture
     */
    public Picture()
    {
        // nothing to do... instance variables are automatically set to null
    }

    /**
     * Draw this picture.
     */
    public void draw()
    {    
        sun = new Circle();
        sun.changeColor("yellow");
        sun.moveHorizontal(180);
        sun.moveVertical(-10);
        sun.changeSize(60);
        sun.makeVisible();

        sun = new Circle();
        sun.changeColor("yellow");
        sun.moveHorizontal(180);
        sun.moveVertical(-10);
        sun.changeSize(60);
        sun.makeVisible();

        sun = new Circle();
        sun.changeColor("yellow");
        sun.moveHorizontal(180);
        sun.moveVertical(-10);
        sun.changeSize(60);
        sun.makeVisible();
    }

PictureTest.java是主要的地方:

public class PictureTest
{
   public static void main(String[] args)
   {
        Picture p = new Picture();
        p.draw();

   }
}

当我运行它时,而不是因为有三个太阳而打印3,它会打印:

1
1
1

我不完全确定为什么会这样,但我认为这可能与我从Circle类打印的事实有关,因此每次创建一个圆圈时它都会打印1.我试过了改变它,以便它从PictureTest中的main打印实例,但我无法使它工作。

谢谢!

8 个答案:

答案 0 :(得分:2)

将您的private int instances;变量更改为静态

答案 1 :(得分:2)

instances

的每个实例都有Circle的不同实例

如果您不希望出现这种情况,请将instances静态

private static int instances;

答案 2 :(得分:2)

instances = 0;
instances++;

instances将始终等于1

您需要做的是使instances成为static变量。

public class Circle
{
    public static int instances = 0;
}

然后在你的构造函数类

instances ++;

答案 3 :(得分:1)

创建静态变量,例如static int counter = 0;,并在每个方法中增加其值:

 void veryImportantMethod(){
 //great code goes here
 counter ++;
}

答案 4 :(得分:1)

您的变量instances是一个成员变量,这意味着它在Object(在本例中为Circle对象)的成员资格范围内。在创建新的Object时,您将创建instance变量的新实例。

要缓解此问题,您需要创建变量static,这意味着它将在该类的所有Object内共享。

其他替代品也存在。例如,您可以在Circle类之外生效,并在创建其他Circle对象的协调下更新它。如何解决这个问题在很大程度上取决于你要解决的确切问题,但它可能就像

一样简单
 Circle one = new Circle(...);
 circleCount++;
 Circle two = new Circle(...);
 circleCount++;

或者,如果您更喜欢Factory模式

 Circle circle = CircleFactory.newCircle(...);
 Circle circle = CircleFactory.newCircle(...);
 int count = CircleFactory.getCreatedCircleCount();

其中CircleFactory有一个像

这样的方法
 private static int circleCount;

 public static Circle newCircle(...) {
   circleCount++;
   return new Circle(...);
 }

 public int getCreatedCircleCount() {
   return circleCount;
 }

简而言之,有很多方法可以做到这一点,但是,随着时间的推移,您会发​​现如何选择最佳方法,考虑您正在解决的问题,维护需求以及在您避开之后使代码更具可读性的能力过去几周(或几年)一直在使用它。

答案 5 :(得分:0)

你有答案:“每次创建一个圆圈时都会打印1”。为避免这种情况,您必须将字段instances声明为static

答案 6 :(得分:0)

尝试使用以下内容:

private static int fooCounter = 0;
private static int barCounter = 0;
private static int objectInstance = 0;

public MySuperTrackedObject(){
    objectInstance++;
    ...
}

public MySuperTrackedObject(String aGoodName){
    objectInstance++;
    ...
}

public void foo(){
    fooCounter ++;
    ...
}
public void bar(){
    barCounter ++;
    ...
}

答案 7 :(得分:0)

instances必须为static才能为整个类提供单个值,而不是每个实例一个值。另请注意,构造函数中的以下代码即使在将其设置为静态之后也无法正常工作:

instances = 0; //this line here will cause your instances to revert to zero
instances++;   //and then, to one, no matter how many you're supposed to have