Как упростить ввод пользователя - PullRequest
0 голосов
/ 17 февраля 2020

Как мне упростить этот код?
Я проверяю каждый ввод на наличие ошибок, но, как и я, код дублируется.

long houseNumberOfFloors;
while (true) {
  System.out.print("Enter valid house number of floors: ");
  try {
    houseNumberOfFloors = Long.parseLong(br.readLine());
  } catch (NumberFormatException e) {
    continue;
  }
  if (FlatAttrValidator.checkHouseNumberOfFloors(houseNumberOfFloors)) {
    break;
  }
}

Integer houseNumberOfLifts;
while (true) {
  System.out.print("Enter valid house number of lifts: ");
  try {
    houseNumberOfLifts = Integer.parseInt(br.readLine());
  } catch (NumberFormatException e) {
    continue;
  }
  if (FlatAttrValidator.checkHouseNumberOfLifts(houseNumberOfLifts)) {
    break;
  }
}

Ответы [ 3 ]

2 голосов
/ 17 февраля 2020

Я создал для вас следующее решение, используя функциональные интерфейсы:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class IReader {
    public static void main(String args[]) {
        InputStreamReader in= new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(in);    

      Integer houseNumberOfFloors = getNumber(br, "Enter valid house number of floors: ", (i) -> FlatAttrValidator.checkHouseNumberOfFloors(i));
      Integer houseNumberOfLifts = getNumber(br, "Enter valid house number of lifts: ", (i) -> FlatAttrValidator.checkHouseNumberOfLifts(i));
      System.out.println("" + houseNumberOfFloors +"-" +houseNumberOfLifts);
    }

    public interface Checker {
        boolean check(Integer i);
    }

    private static Integer getNumber(BufferedReader br, String query, Checker checker) {

        Integer number;
        while (true) {
          System.out.println(query);
          try {
            number = Integer.parseInt(br.readLine());
          } catch (NumberFormatException|IOException e) {
            continue;
          }
          if (checker.check(number)) {
            break;
          }
        }
        return number;
    }

    private static class FlatAttrValidator {
        static boolean checkHouseNumberOfFloors(Integer i) {
            return i>0;
        }
        static boolean checkHouseNumberOfLifts(Integer i) {
            return i>0;
        }
    }
}

Он работает на https://www.jdoodle.com/online-java-compiler/.

2 голосов
/ 17 февраля 2020

Вы можете передать преобразование и проверку как функцию (и).

private <T> T ask(BufferedReader br, String question, Function<String, T> converter) {
    Objects.requireNonNull(converter);
    while (true) {
        System.out.print(question);
        String answer = br.readLine();
        try {
            T result = converter.apply(answer);
            if (result != null) {
                return result;
            }
        } catch (RuntimeException e) {
        }
    }
}

int houseNumberOfLifts = (Integer) ask(br, "Enter valid house number of lifts: ",
    answer -> {
        int lifts = Integer.parseInt(answer);
        return FlatAttrValidator.checkHouseNumberOfLifts(lifts) ? lifts : null;
});

Здесь answer -> объявляет параметр answer

0 голосов
/ 17 февраля 2020

Вы можете сделать это следующим образом:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        long houseNumberOfFloors = input("Enter valid house number of floors: ", br, "checkHouseNumberOfFloors");
        Integer houseNumberOfLifts = input("Enter valid house number of lifts: ", br, "checkHouseNumberOfLifts");
    }

    static int input(String message, BufferedReader br, String methodName) {
        int value = 0;
        Method method;
        Boolean valid;
        System.out.print(message);
        try {
            value = Integer.parseInt(br.readLine());
            method = FlatAttrValidator.class.getMethod(methodName, Integer.class);
            valid = (Boolean) method.invoke(null, value);
            if (!valid) {
                input(message, br, methodName);
            }
        } catch (IOException | NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
            input(message, br, methodName);
        }
        return value;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...