Javaの文字・数字の入力をBufferedReaderクラスを使って書いてみた

使用例は変数への代入だけ書いています。

```java:Input.java
class Input {
	private final BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
	public String getString() throws IOException {
		return input.readLine();
	}
	private boolean checkOver(long num, long max, long min) {
		if (max < min) return !this.checkOver(num, min, max);
		return min <= num && num <= max;
	}
	private boolean checkOver(double num, double max, double min) {
		if (max < min) return !this.checkOver(num, min, max);
		return min <= num && num <= max;
	}
	public short getsnum() throws IOException, NumberFormatException {
		return Short.parseShort(this.getString());
	}
	public short getsnum(short max, short min) throws IOException, NumberFormatException {
		if (max < min) return this.getsnum(min, max);
		short s = this.getsnum();
		if (!this.checkOver(s, max, min)) throw new IOException("入力された値が設定されている最大値または最小値の範囲を超えています。");
		else return s;
	}
	public int getinum() throws IOException, NumberFormatException {
		return Integer.parseInt(this.getString());
	}
	public int getinum(int max, int min) throws IOException, NumberFormatException {
		if (max < min) return this.getinum(min, max);
		int i = this.getinum();
		if (!this.checkOver(i, max, min)) throw new IOException("入力された値が設定されている最大値または最小値の範囲を超えています。");
		else return i;
	}
	public long getlnum() throws IOException, NumberFormatException {
		return Long.parseLong(this.getString());
	}
	public long getlnum(long max, long min) throws IOException, NumberFormatException {
		if (max < min) return this.getlnum(min, max);
		long l = this.getlnum();
		if (!this.checkOver(l, max, min)) throw new IOException("入力された値が設定されている最大値または最小値の範囲を超えています。");
		else return l;
	}
	public float getfnum() throws IOException, NumberFormatException {
		return Float.parseFloat(this.getString());
	}
	public float getfnum(float max, float min) throws IOException, NumberFormatException {
		if (max < min) return this.getfnum(min, max);
		float f = this.getfnum();
		if (!this.checkOver(f, max, min)) throw new IOException("入力された値が設定されている最大値または最小値の範囲を超えています。");
		else return f;
	}
	public double getdnum() throws IOException, NumberFormatException {
		return Double.parseDouble(this.getString());
	}
	public double getdnum(double max, double min) throws IOException, NumberFormatException {
		if (max < min) return this.getdnum(min, max);
		double f = this.getdnum();
		if (!this.checkOver(f, max, min)) throw new IOException("入力された値が設定されている最大値または最小値の範囲を超えています。");
		else return f;
	}
}
```

使い方

```java:Main.java
public class Main {
	public static void main(String[] args) throws Exception {
		Input input = new Input();
		String str = input.getString();
		short s1 = input.getsnum(Short.MAX_VALUE, Short.MIN_VALUE);
		int i1 = input.getinum(Integer.MAX_VALUE, Integer.MIN_VALUE);
		long l1 = input.getlnum(Long.MAX_VALUE, Long.MIN_VALUE);
		float f1 = input.getfnum(Float.MAX_VALUE, Float.MIN_VALUE);
		double d1 = input.getdnum(Double.MAX_VALUE, Double.MIN_VALUE);
		short s2 = input.getsnum();
		int i2 = input.getinum();
		long l2 = input.getlnum();
		float f2 = input.getfnum();
		double d2 = input.getdnum();

	}
}
```

>ほんのちょっとだけ可読性を上げました。その代わり、範囲指定必須になってます。

>```java:Input.java
public class Input extends NumInput {
	public long getnum(long max, long min) throws IOException, NumberFormatException {
		return this.numRetWhenInRange(this.getlnum(), max, min);
	}
	public int getnum(int max, int min) throws IOException, NumberFormatException {
		return (int)this.numRetWhenInRange(this.getlnum(), max, min);
	}
	public short getnum(short max, short min) throws IOException, NumberFormatException {
		return (short)this.numRetWhenInRange(getlnum(), max, min);
	}
	public double getnum(double max, double min) throws IOException, NumberFormatException {
		return this.numRetWhenInRange(getdnum(), max, min);
	}
	public float getnum(float max, float min) throws IOException, NumberFormatException {
		return (float)this.numRetWhenInRange(this.getdnum(), max, min);
	}
}
abstract class StringInput {
	private final BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
	public String getString() throws IOException {
		return this.input.readLine();
	}
}
abstract class NumInput extends StringInput {
	protected long getlnum() throws IOException, NumberFormatException {
		return Long.parseLong(this.getString());
	}
	protected double getdnum() throws IOException, NumberFormatException {
		return Double.parseDouble(this.getString());
	}
	protected long numRetWhenInRange(long num, long max, long min) throws IOException  {
		if (max < min) return this.numRetWhenInRange(num, min, max);
		if (num < min || max < num) throw new IOException("入力された値が設定されている最大値または最小値の範囲を超えています。");
		else return num;
	}
	protected double numRetWhenInRange(double num, double max, double min) throws IOException  {
		if (max < min) return this.numRetWhenInRange(num, min, max);
		if (num < min || max < num) throw new IOException("入力された値が設定されている最大値または最小値の範囲を超えています。");
		else return num;
	}
}
>```
>使い方
>
>```java:Main.java
public class Main {
	public static void main(String[] args) throws Exception {
		Input input = new Input();
		String str = input.getString();
		short s = input.getnum(Short.MAX_VALUE, Short.MIN_VALUE);
		int i = input.getnum(Integer.MAX_VALUE, Integer.MIN_VALUE);
		long l = input.getnum(Long.MAX_VALUE, Long.MIN_VALUE);
		float f = input.getnum(Float.MAX_VALUE, Float.MIN_VALUE);
		double d = input.getnum(Double.MAX_VALUE, Double.MIN_VALUE);
	}
}
>```
>最大・最小指定する時にその型の最大・最小の範囲外の値は指定できないからいっかみたいなノリでキャストしましたが、正直なことを言うと、自分としては黒歴史でもあります。
>あと、コメントにもあった方法も一応紹介しておきます。
>警告出てたので一応修正しておきました。これはInputクラスがabstractクラスなので使用例と一体になっています。

>```java:Main.java
public class Main extends Input<Integer> {
	public static void main(String[] args) throws Exception {
		int i = new Main().getValue(Integer.MIN_VALUE, Integer.MAX_VALUE);
	}
	@Override
	protected Integer convertValueFromString(String str) {
		return Integer.valueOf(str);
	}
}
abstract class Input<T extends Comparable<T>> {
    protected abstract T convertValueFromString(String str);
    private final BufferedReader reader =
            new BufferedReader(new InputStreamReader(System.in));
    public T getValue(T min, T max) throws IOException {
        T value = convertValueFromString(reader.readLine());
        if (!betweenMinAndMax(value, min, max)) {
            throw new IOException("入力された値が設定されている最大値または最小値の範囲を超えています。");
        }
        return value;
    }
    private boolean betweenMinAndMax(T value, T min, T max) {
        if (value == null || min == null || max == null) {
            throw new IllegalStateException("value, min, maxの中に不正な値があります");
        }
        if (min.compareTo(max) > 0) {
            return betweenMinAndMax(value, max, min);
        }
        return value.compareTo(min) >= 0 && value.compareTo(max) <= 0;
    }
}
>```