Использование методов на анонимных классах - PullRequest
2 голосов
/ 27 октября 2011

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

Вот что я пытаюсь сделать. Назначение, над которым я работаю, предназначено для многократного запуска из командной строки с двумя возможными наборами аргументов: ["CREATE" "cardType"] или ["VERIFICATION" "accountNumber" "actionAmout "]. Каждый раз, когда передается флаг «CREATE», создается анонимный экземпляр класса - конструктор создает различные поля данных, связанные с классом, записывает их в файл, и программа завершает работу. Хорошо, пока. Вот фрагмент из конструктора (их несколько, но все они практически идентичны):

if(issuer.compareTo("AE") == 0)
    {
        try
        {
        cardType = "American Express";
        firstDigit = 3;
        accountNumber = accountNumberGen(firstDigit);            
        memberSince = new java.util.Date();
        limit = setLimit(accountNumber);
        output.write(accountNumber + "|" + cardType + "|" +
                memberSince + "|" + limit + "\r\n");
        }
        catch(Exception e)
        {
            System.out.printf("An unexpected error occured. Sorry.\n"
                    + "American Express Constructor.");
            System.exit(0);

        }

Итак, вот что я пытаюсь выяснить. Следующим шагом является флаг «ПРОВЕРКА». Если флаг проверки передается из командной строки, мне нужно зайти в файл, прочитать данные, хранящиеся в нем, внести любые изменения и записать его обратно в файл. Опять хорошо пока. Вот проблема:

Поскольку экземпляра класса нет, я не могу вызывать методы в этом классе. Тем не менее, метод Verification не нуждается в экземпляре класса для своей работы - он полностью работает с аргументами командной строки и чтением / записью в файл. Итак, как я могу анонимно вызывать методы в классе? Нужно ли создавать другой класс проверки или просто переместить метод в мой основной класс? Я немного сомневаюсь в этом, потому что назначение подразумевает, что должен быть один класс, который обрабатывает создание и проверку. Или, другая возможность, моя логика в подходе к этой проблеме просто ошибочна?

Этот код находится в стадии разработки - исключения станут более конкретными, и все открытые файловые потоки будут закрыты и т. Д.

Ответы [ 2 ]

3 голосов
/ 27 октября 2011

Одна аббревиатура: KISS :

Да, вы можете делать все виды магии, вызывая методы с помощью отражения и т. Д. Но зачем?

Создать главнуюметод, который принимает первый аргумент и создает CreateHandler или VerificationHandler.Оба реализуют интерфейс Handler, который имеет этот метод:

 void run(String[] args);

Таким образом, после переключения вы можете вызывать новый обработчик с помощью handler.run(args), независимо от того, какой он есть.

Затем обработчики могут исследовать командные строки, чтобы выяснить, чего хочет пользователь.

Переместить общий код (например, загрузку / сохранение) в вспомогательные классы.Методы должны быть короткими (5-15 строк).Каждый метод должен делать одну вещь.Переместите сложные задачи в вспомогательные методы.

2 голосов
/ 27 октября 2011

Если я правильно понимаю ваш вопрос / задание (и я не уверен в этом, каковы требования этого задания? Требуется ли вам использовать анонимные классы? В Java нет такого понятия, как анонимный метод, только анонимные классы.), может показаться, что вам нужен одноразовый класс проверки или статический метод.

Одноразовый метод:

Verification v = new Verification(commandLineArgs);
v.verify();
// Done with 'v'

Статический метод ... method:

Verification.verify(commandLineArgs);

Где метод определен в классе как:

public class Verification {
   ...
   public static void verify(String ... commandLineArgs) {

   }
   ...
}
...