从控制台读取不同类型的数字时减少代码重复

时间:2017-09-20 15:09:22

标签: java console java.util.scanner

我创建了三个方法readLong,readInt和readDouble,基本上做同样的事情。唯一的区别是扫描仪调用的方法。如何通过将重复代码全部转换为一种方法来减少重复代码?

public long readLong(String description)
    {
        System.out.println(description);
        long nrToReturn = 0;
        boolean acceptedValue = false;

        do {
            System.out.println();
            System.out.print("Choose one: ");
            try
            {
                nrToReturn = consoleScanner.nextLong(); //Only line thats different except return value
                acceptedValue = true;
            }catch(Exception e)
            {
                acceptedValue = false;
                consoleScanner.nextLine();
            }
        }while (!acceptedValue);

        consoleScanner.nextLine();
        return nrToReturn;
    }

1 个答案:

答案 0 :(得分:2)

这里我们提出一个想法:

import java.util.Scanner;

public class ScannerTest {

    private Scanner consoleScanner;

    public ScannerTest() {
        consoleScanner = new Scanner(System.in);
    }

    @SuppressWarnings("unchecked")    
    private <T extends Number> T readType(String description, Class<T> desiredType) {
        System.out.println(description);
        Number result = null;

        while (result == null) {
            System.out.println();
            System.out.print("Choose one: ");
            try {
                if (Integer.class.equals(desiredType)) {
                    result = new Integer(consoleScanner.nextInt());
                } else if (Long.class.equals(desiredType)) {
                    result = new Long(consoleScanner.nextLong());
                }
            } catch(Exception e) {
                consoleScanner.nextLine();
            }
        }

        consoleScanner.nextLine();
        return (T) result;
    }

    public long readLong(String description) {
        return this.readType(description, Long.class);
    }

    public int readInt(String description) {
        return this.readType(description, Integer.class);
    }

    public static void main(String[] args) {
        ScannerTest t = new ScannerTest();
        t.readLong("Reading a long value...");
        t.readInt("Reading an integer value...");
    }  
}

更新,遵循@ Michu93单一透明方法的想法:

import java.util.Scanner;

public class ScannerTest {

    private Scanner consoleScanner;

    public ScannerTest() {
        consoleScanner = new Scanner(System.in);
    }

    @SuppressWarnings("unchecked")
    public <T extends Number> T readNumber(String description) {
        System.out.println(description);
        Number result = null;

        while (result == null) {
            System.out.print("\nChoose one: ");
            String textRead = consoleScanner.next();

            try {
                result = new Integer(textRead);
            } catch(Exception e1) {
                try {
                    result = new Long(textRead);
                } catch (Exception e2) {
                    try {
                        result = new Double(textRead);
                    } catch (Exception e3) {
                    }
                }
            }
            consoleScanner.nextLine();
        }

        return (T) result;
    }

    public static void main(String[] args) {
        ScannerTest t = new ScannerTest();
        for (int i = 0; i < 3; i++) {
            Number input = t.readNumber(i + ": Reading int, long or double...");
            System.out.println("Input class: " + input.getClass().getCanonicalName());
            System.out.println("Input value: " + input);
        }
    }  
}