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

Java 从控制台读取不同类型的数字时减少代码重复,java,console,java.util.scanner,Java,Console,Java.util.scanner,我已经创建了三个方法readLong、readInt和readDouble,它们基本上做相同的事情。唯一的区别是扫描仪调用的方法。如何通过将它们全部转换为一种方法来减少重复代码 public long readLong(String description) { System.out.println(description); long nrToReturn = 0; boolean acceptedValue = false;

我已经创建了三个方法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;
    }

我们有一个想法:

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...");
    }  
}
import java.util.Scanner;
公共级扫描测试{
专用扫描仪控制台扫描仪;
公共扫描测试(){
控制台扫描仪=新扫描仪(System.in);
}
@抑制警告(“未选中”)
private T readType(字符串描述,类desiredType){
系统输出打印项次(说明);
数字结果=空;
while(结果==null){
System.out.println();
系统输出打印(“选择一个:”;
试一试{
if(Integer.class.equals(desiredType)){
结果=新整数(consoleScanner.nextInt());
}else if(Long.class.equals(desiredType)){
结果=新长(consoleScanner.nextLong());
}
}捕获(例外e){
consoleScanner.nextLine();
}
}
consoleScanner.nextLine();
返回(T)结果;
}
公共long readLong(字符串描述){
返回此.readType(说明,Long.class);
}
公共整型readInt(字符串描述){
返回此.readType(说明,Integer.class);
}
公共静态void main(字符串[]args){
ScannerTest t=新的ScannerTest();
t、 readLong(“读取长值…”);
t、 readInt(“读取整数值…”);
}  
}
更新,遵循@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);
        }
    }  
}
import java.util.Scanner;
公共级扫描测试{
专用扫描仪控制台扫描仪;
公共扫描测试(){
控制台扫描仪=新扫描仪(System.in);
}
@抑制警告(“未选中”)
公共T读取编号(字符串描述){
系统输出打印项次(说明);
数字结果=空;
while(结果==null){
系统输出打印(“\n选择一个:”);
String textRead=consoleScanner.next();
试一试{
结果=新整数(文本读取);
}捕获(异常e1){
试一试{
结果=新长(文本读取);
}捕获(异常e2){
试一试{
结果=新的双精度(文本读取);
}捕获(例外e3){
}
}
}
consoleScanner.nextLine();
}
返回(T)结果;
}
公共静态void main(字符串[]args){
ScannerTest t=新的ScannerTest();
对于(int i=0;i<3;i++){
数字输入=t.readNumber(i+“:读取整型、长型或双精度…”);
System.out.println(“输入类:”+Input.getClass().getCanonicalName());
System.out.println(“输入值:“+Input”);
}
}  
}

我们有一个想法:

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...");
    }  
}
import java.util.Scanner;
公共级扫描测试{
专用扫描仪控制台扫描仪;
公共扫描测试(){
控制台扫描仪=新扫描仪(System.in);
}
@抑制警告(“未选中”)
private T readType(字符串描述,类desiredType){
系统输出打印项次(说明);
数字结果=空;
while(结果==null){
System.out.println();
系统输出打印(“选择一个:”;
试一试{
if(Integer.class.equals(desiredType)){
结果=新整数(consoleScanner.nextInt());
}else if(Long.class.equals(desiredType)){
结果=新长(consoleScanner.nextLong());
}
}捕获(例外e){
consoleScanner.nextLine();
}
}
consoleScanner.nextLine();
返回(T)结果;
}
公共long readLong(字符串描述){
返回此.readType(说明,Long.class);
}
公共整型readInt(字符串描述){
返回此.readType(说明,Integer.class);
}
公共静态void main(字符串[]args){
ScannerTest t=新的ScannerTest();
t、 readLong(“读取长值…”);
t、 readInt(“读取整数值…”);
}  
}
更新,遵循@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);
        }
    }  
}
import java.util.Scanner;
公共级扫描测试{
专用扫描仪控制台扫描仪;
公共扫描测试(){
控制台扫描仪=新扫描仪(System.in);
}
@抑制警告(“未选中”)
公共T读取编号(字符串描述){
系统输出打印项次(说明);
数字结果=空;
while(结果==null){
系统输出打印(“\n选择一个:”);
String textRead=consoleScanner.next();
试一试{
结果=新整数(文本读取);
}捕获(异常e1){
试一试{
结果=新长(文本读取);
}捕获(异常e2){
试一试{
结果=新的双精度(文本读取);
}捕获(例外e3){
}
}
}
consoleScanner.nextLine();
}
返回(T)结果;
}
公共静态void main(字符串[]args){
ScannerTest t=新的ScannerTest();
对于(int i=0;i<3;i++){
数字输入=t.readNumber(i+“:读取整型、长型或双精度…”);
System.out.println(“输入类:”+Input.getClass().getCanonicalName());
System.out.println(“输入值:“+Input”);
}
}  
}

发布这个问题。看看Java中的泛型类型。这些方法的调用方如何知道调用哪个方法?我认为