2012-01-24 1 views
0

UPDATE :: OK я ставлю оригинальную постановку задачи здесьподсчитайте звонки на метод без использования статического

Учитывая Основной класс создать метод 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?

+0

Кажется, что домашнее задание вам нужно сделать, это правильно? – Laf

+0

не _ технически_ домашнее задание Мой проф спросил в классе «позволяет посмотреть, можете ли вы это решить» – lucifer

+0

В этом случае я добавил тег домашней работы, так как сообщество не захочет дать вам точный ответ, а поможет вам найти с хорошо ориентированными советами. – Laf

ответ

0

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

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"); 

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

как помечать нить в виде nswered?

+0

Я знаю его немного слишком поздно, но: все эти вложенные звонки, действительно ли они нужны? возможно, вы могли бы указать номер человека в динамическом виде ... Представьте, что вам нужен метод create60Persons() – jambriz

+0

, на самом деле вопрос, который я задал, был заданием моего профессора, он хотел заставить нас подумать, как мы можем рассчитать число объектов без использования статических переменных, а вложенные вызовы находились в операторе задачи – lucifer

+0

, и сэр попросил нас использовать связанный список, но я запрограммировал его без использования связанного списка – lucifer

7

Если вы хотите вычислить, сколько раз был вызван статический метод, вы используете , чтобы использовать статическую переменную - это действительно глобальное состояние. EDIT: Да, вы можете использовать файловую систему в качестве другого хранилища для глобального состояния, но я бы сказал, что это вообще плохая идея - особенно если это только, чтобы обойти требование в академическом вопросе.

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

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

EDIT: Да, если вы можете рассчитывать на кооперативные звонящих - и вы можете измените сигнатуры метода - тогда вы можете сохранить (скажем) AtomicInteger и убедиться, что вы всегда передаете ссылку на тот же объект в метод createStudent. Опять же, нам действительно нужно знать, каковы правила вопроса ...

+0

Фактически в заявлении проблемы указано не использовать статическую переменную и рассчитать количество раз, когда createPerson() был выполнен на этой основе, мне нужно инициализировать массив класса Student и затем введите столько имен и выведите их – lucifer

+0

@lucifer: в своем ответе я объяснил, как вы * не можете * автоматически подсчитывать количество вызовов статического метода без использования статической переменной * где-то *. (Я полагаю, вы можете использовать файловую систему как свое глобальное состояние, но она во многом похожа на нее.) Это действительно непонятно, какова цель этого. Возможно, если бы вы могли дать больше контекста ... –

+0

О, извините Я делаю это с помощью обработки файлов в createfunction() defination. Я пишу в файл, тогда я прочитаю файл и просто посчитаю нет переменных в файле! , таким образом, не требуется статическая переменная – lucifer

0

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

  • статической переменной
  • или передать переменную в качестве ссылки

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

    int createPerson (int counter);

+0

Хорошая попытка! Ваш первый пример (передача Integer) не работает, потому что Integer неизменен (вместо этого вы можете передать int [1], а это kludge). И ваша вторая версия работает. Вроде. Он не будет работать в многопоточном случае. Если два отдельных потока вызывают createPerson, они не могут поддерживать правильность подсчета. – user949300

+0

@ user949300: Используя один объект 'AtomicInteger', сделайте это, заметьте :) –

+0

удалил мой пример для передачи по ссылке. –

2

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

+0

Да, если мы сможем изменить подпись 'createPerson' (или методы, которые ее называют), которая действительно является допустимым вариантом. Добавили это в свой ответ. Это не помешает 'createPerson' быть вызванным из другого кода и, конечно,« потерять »этот счет. Трудно узнать, что разрешено, не видя вопроса, к сожалению ... –

+0

Если 'createPerson (int inCount)' вызывается из нескольких потоков, что они передают для inCount? Хм, они, вероятно, нуждаются в каком-то глобальном статике где-то ... – user949300

0

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

0

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

2

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

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

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

System.getProperty("methodCounter"); 
Смежные вопросы