Java 从控制台读取不同类型的数字时减少代码重复
我已经创建了三个方法readLong、readInt和readDouble,它们基本上做相同的事情。唯一的区别是扫描仪调用的方法。如何通过将它们全部转换为一种方法来减少重复代码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;
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中的泛型类型。这些方法的调用方如何知道调用哪个方法?我认为