Но, если вы настаиваете на том, чтобы не изменять свои параметры и сохранять ту же структуру вашего фактического кода, вы можете использовать метод синглтона, который я не рекомендую , особенно если вы работаете с потоками. Он отлично работает, если вы не используете потоки.
Таким образом, чтобы использовать один экземпляр Scanner
(или любой другой тип данных или класс), вы можете использовать шаблон проектирования "Singleton", который состоит в создании экземпляра один экземпляр вашего объекта для всего проекта.
Определение Singleton для ввода с клавиатуры (новый класс):
import java.util.Scanner;
public class ScannerSingletonKeyboard {
private static Scanner sc = null;
private ScannerSingletonKeyboard(){
sc = new Scanner(System.in);
}
public static Scanner getInstance(){
if(sc==null)
new ScannerSingletonKeyboard();
return sc;
}
}
Определение Singleton для ввода из файла (новый класс) ):
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
public class ScannerSingletonFile {
private static Scanner sc = null;
private ScannerSingletonFile(){
try {
Scanner sc = new Scanner(new File("File"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static Scanner getInstance(){
if(sc==null)
new ScannerSingletonFile();
return sc;
}
}
Метод класса треугольника:
public Triangle readingTriangle(int value) throws Exception {
if(value == 1) {
Scanner sc = ScannerSingletonKeyboard.getInstance();
Triangle reserve =new Triangle();
reserve.color = sc.next();
reserve.setA(reserve.A.readingPoint(1));
reserve.setB(reserve.B.readingPoint(1));
reserve.setC(reserve.C.readingPoint(1));
return reserve;
}
if(value == 0) {
Triangle reserve1 =new Triangle();
Scanner input = ScannerSingletonFile.getInstance();
reserve1.color=input.next();
reserve1.setA(reserve1.A.readingPoint(0));
reserve1.setB(reserve1.B.readingPoint(0));
reserve1.setC(reserve1.C.readingPoint(0));
return reserve1;
}
return new Triangle();
}
Метод класса точки:
public Point readingPoint(int value) throws Exception {
if(value==1) {
Scanner sc = ScannerSingletonKeyboard.getInstance();
Point reserve=new Point();
reserve.c1 = sc.nextInt();
reserve.c2 = sc.nextInt();
return reserve;
}
if(value==0) {
Scanner input = ScannerSingletonFile.getInstance();
Point reserve1=new Point();
input.next();
reserve1.c1=input.nextInt();
reserve1.c2=input.nextInt();
return reserve1;
}
return new Point();
}
В классе теста:
Scanner sc = ScannerSingletonKeyboard.getInstance();
int triangleNumber = sc.nextInt();
List<Triangle> triangleList = new ArrayList<Triangle>();
for (int i = 0; i < triangleNumber; i++) {
Triangle t = new Triangle();
Triangle t1 = t.readingTriangle(0);
triangleList.add(t1);
}
System.out.println(triangleList);
и каждый раз, когда вы хотите использовать свой сканер в любом месте, вам нужно всего лишь вызвать ScannerSingletonKeyboard.getInstance()
для ввода с клавиатуры или ScannerSingletonFile.getInstance()
для ввода файла, который вернет ваш единственный экземпляр сканера