2017-09-20 2 views
0

Ich habe drei Methoden readLong, readInt und readDouble erstellt, die im Grunde die gleiche Sache macht. Einziger Unterschied ist die Methode, die von einem Scanner aufgerufen wird. Wie kann ich doppelten Code reduzieren, indem Sie alle auf eine Methode umstellen?Reduzieren Sie Code-Duplizierung beim Lesen verschiedener Arten von Zahlen aus der Konsole

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; 
    } 
+0

Beitrag dieser Frage auf [Code-Review] (https://codereview.stackexchange.com/). –

+0

Werfen Sie einen Blick auf generische Typen in Java – Michu93

+0

Wie weiß der Aufrufer dieser Methoden, welchen Aufruf er ausführen soll? –

Antwort

2

Hier gehen wir mit einer Idee:

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..."); 
    } 
} 

aktualisieren nach @ Michu93 Idee einer einzigen transparenten Methode:

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); 
     } 
    } 
} 
+0

Edit: Ich dachte das gleiche über die Verwendung von Generika anstelle von Objekt, wie @ Michu93 wies darauf hin. Aber ich glaube nicht, dass es möglich ist, eine solche öffentliche Methode [public static T readNumber (String description)] zu erstellen, ohne zu wissen, welche Art von Eingabe benötigt wird, es sei denn, Sie definieren eine Hierarchie zwischen Typen und versuchen beide zu lesen Geben Sie bei jedem Aufruf der Methode bis zum Erfolg ein. Meine Antwort wurde auf die Idee von angepasst. [Ich kann den Original-Thread nicht kommentieren, da ich noch keine 50 Punkte habe, tut mir leid]. –

Verwandte Themen