计算在不使用静态的情况下对方法进行的总调用

时间:2012-01-24 18:59:03

标签: java file static io

更新::好的我在这里提出原始问题陈述

给定Main类创建一个方法createPerson并在任何其他方法中多次调用它,然后根据createPerson执行的次数,你必须初始化对象和输入学生的名字并输出名。

一旦我知道有多少个对象我必须创建它,以便编写后面的部分

对于找到要创建的对象数量的先前问题,我选择了文件处理的方式,因为我来自C,C ++背景,其中文件处理相对简单。

现在我应该如何修改程序,以便在文件中写入一个整数,稍后当我读取文件时,我将获得对象的数量

这个例子禁止使用静态变量,它是一种脑筋急转弯 所以使用静态

这是我的Main.java文件

import java.io.IOException;


public class Main {
    public static void main(String[] args) throws IOException{
        int i;
        Student[] totalStudents = new Student[10];
         Student.create3Persons();
          Student.create2Persons();
    }

}

这是我的Student.java文件

import java.io.*;
public class Student {


    private static void createPerson() throws IOException{
        int number=0;
        File file = new   File("arg.txt", null);
        FileOutputStream fos = new FileOutputStream(file);
        DataOutputStream dos = new DataOutputStream(fos);

        FileInputStream fis = new FileInputStream(file);
        DataInputStream dis = new DataInputStream(fis);
        while(dis.readInt()!= -1)
        {
            number++;
            dos.writeInt(1);
        }
    }

     static void create2Persons() throws IOException{
        Student.createPerson();
        Student.createPerson();
    }

    static void create3Persons() throws IOException{
        Student.createPerson();
        Student.createPerson();
        Student.createPerson();
    }
}

我应该如何修改这个程序,以便计算被调用函数createPerson的次数?

6 个答案:

答案 0 :(得分:7)

如果要计算静态方法的调用次数,则 使用静态变量 - 它是真正的全局状态。编辑:是的,你可以使用文件系统作为全球状态的另一个存储库,但我个人说这通常是一个坏主意 - 特别是如果只是来绕过学术问题中的要求。

我想这有一些例外 - 如果静态方法可证明只从一个类调用,并且该类是单例,那么该单例中可能有一个实例方法......但这几乎是一个角落案件。在您的情况下,create3Personscreate2Persons都可以从包中的任何位置访问,并且它们不是单例中的实例方法,因此没有单个上下文保持呼叫计数除了一个静态变量。

也许如果你能解释一下你想要达到的目标,我们可以帮助你更多......

编辑:是的,如果您可以依赖合作来电者 - 并且您可以更改方法签名 - 那么您可以保留(比方说)AtomicInteger,并确保您始终通过将同一个对象引用到createStudent方法中。同样,我们真的需要知道问题的规则是什么......

答案 1 :(得分:2)

我不同意@Jon Skeet,我不认为你使用静态变量。为什么不简单地返回创建的项目数,并将总计数保存在main方法的局部变量中? (假设您当然允许修改方法签名,否则您会遇到全局变量解决方案)您似乎已经有一个未使用的计数器,为什么不使用它呢?

答案 2 :(得分:2)

您可以使用:

synchronized(this){
   System.setProperty("methodCounter",number++);
}

而不是基于文件的计数器。并在主要方法:

System.getProperty("methodCounter"); 

答案 3 :(得分:0)

大多数情况下,当我们希望保留整个方法的价值时,我们要么

  • 静态变量
  • 或将变量作为参考传递

  • 或传递变量并返回更新的变量并再次使用

    int createPerson(int counter);

答案 4 :(得分:0)

使用AOP(面向方面​​编程)。

答案 5 :(得分:0)

您可以使用系统属性来存储调用数量......这样您就不必使用文件系统或AOP或更改方法签名。