Рассчитать общее количество обращений к методу без использования статического - PullRequest
0 голосов
/ 24 января 2012

ОБНОВЛЕНИЕ :: ОК, я помещаю исходную формулировку проблемы здесь

Учитывая, что класс 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();
    }

}

и это мy Файл 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 ??

Ответы [ 7 ]

7 голосов
/ 24 января 2012

Если вы хотите вычислить, сколько раз был вызван статический метод, у вас есть для использования статической переменной - это действительно глобальное состояние. РЕДАКТИРОВАТЬ: Да, вы можете использовать файловую систему в качестве другого хранилища для глобального состояния, но я бы лично сказал, что это вообще плохая идея - особенно если это просто , чтобы обойти требование в академическом вопросе.

Полагаю, есть некоторые исключения: если статический метод вызывается только из одного класса, и этот класс является одноэлементным, то в этом синглтоне может быть метод экземпляра ... но это в значительной степени угол дело. В вашем случае create3Persons и create2Persons оба доступны из любого места в пакете, и они не являются методами экземпляра в одиночном коде, поэтому нет единого контекста, в котором можно сохранить счетчик вызовов. кроме статической переменной.

Возможно, если бы вы могли объяснить немного больше о том, чего вы пытаетесь достичь, мы могли бы помочь вам больше ...

РЕДАКТИРОВАТЬ: Да, если вы можете положиться на кооперативных абонентов - и вы можете изменить сигнатуры методов - тогда вы можете оставить (скажем) AtomicInteger и убедиться, что вы всегда передаете ссылку на тот же объект в методе createStudent. Опять же, нам действительно нужно знать, каковы правила вопроса ...

2 голосов
/ 25 января 2012

Вы можете использовать:

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

вместо файлового счетчика. И в основном методе:

System.getProperty("methodCounter"); 
2 голосов
/ 24 января 2012

Я должен не согласиться с @Jon Skeet, я не думаю, что у вас есть для использования статической переменной. Почему бы просто не вернуть количество созданных элементов и сохранить общее количество в локальной переменной в вашем методе main? (конечно, если вам разрешено изменять сигнатуры методов, в противном случае вы застряли с решением глобальной переменной) у вас уже есть неиспользуемый счетчик, почему бы не использовать его?

0 голосов
/ 25 января 2012

я получил решение вместо обработки файлов, я делаю это

 static int createPerson(int c){
        return (++c);
    }

     static int create2Persons(int c) {

    return Student.createPerson(Student.createPerson(c));
    }

    static int create3Persons(int c) {

        return Student.createPerson(Student.createPerson(Student.createPerson(c)));


    }




        public static int create5Persons(int i) {
   return Student.createPerson(Student.createPerson(Student.createPerson(Student.createPerson(Student.createPerson(i)))));
        }

и в основном методе я инициализировал целое число, и я делаю это

 c += Student.create2Persons(i)-1;
          c += Student.create3Persons(i)-1;
          c += Student.create5Persons(i)-1;
          System.out.println(c+"c is");

это экономит использованиефайлов

как пометить ветку как ответили?

0 голосов
/ 25 января 2012

Вы можете использовать системное свойство для хранения количества вызовов ... таким образом, вам не нужно использовать файловую систему или AOP или изменять сигнатуру метода.

0 голосов
/ 25 января 2012

Использовать AOP (Аспектно-ориентированное программирование).

0 голосов
/ 24 января 2012

В основном, когда мы хотим сохранить значение в методе, либо мы выбираем

  • Статическая переменная
  • или передайте переменную как ссылку

  • или передайте переменную, верните обновленную переменную и используйте ее снова

    int createPerson (int counter);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...