如何以更少的重复调用 set 方法。 (Java)
How to call set methods with less repetition . (Java)
你好,我有一堆 do while 语句用于我正在制作的程序,每个语句都有一个不同的 setMethod 在另一个 class 中定义,但是我想以更紧凑的方式执行此操作。我想知道某种循环是否可以做到这一点。或者如果你可以有一个 setMethod 数组。或者任何可以使此代码紧凑的东西。
contestant1 is an object of the class contestant information which contains the set methods for each field.
do {
try {
flag = false;
System.out.println("Please enter your first name.");
String firstName = Scanner.nextLine();
contestant1.setName(firstName);
} catch (InvalidInputException e) {
System.out.println(e.getMessage());
flag = true;
}
} while (flag);
do {
try {
flag = false;
System.out.println("Please enter your last name.");
String lastName = Scanner.nextLine();
contestant1.setLastName(lastName);
} catch (InvalidInputException e) {
System.out.println(e.getMessage());
flag = true;
}
} while (flag);
do {
try {
flag = false;
System.out.println("Please enter your street number.");
String streetNumber = Scanner.nextLine();
contestant1.setStreetNumber(streetNumber);
} catch (InvalidInputException e) {
System.out.println(e.getMessage());
flag = true;
}
} while (flag);
String[] setMethodNames={"First Name","Last Name","Street"};
for(String s:setMethodNames){
do{
try{
flag=false;
System.out.println("Please enter your "+s+" :");
String inp=scanner.nextLine();
callSetFunction(contestant1,s,inp);
}catch(InvalidInputException e){
System.out.println(e.getMessage());
flag = true;
}
}while(flag)
}
private void callSetFunction(Contestant contestant1,String s,String inp){
switch(s){
case "First Name":
contestant1.setFirstName(inp);
break
case "Last Name":
contestant1.setLastName(inp);
break;
case "Street":
contestant1.setStreet(inp);
break;
default:
//do something
}
}
如果您使用的是 Java 8,您可以这样做:
List<String> labels = Arrays.asList(
"Please enter your first name.",
"Please enter your last name.",
"Please enter your street number."
);
Function<String, Void> setters = Arrays.asList(
contestant1::setName,
contestant1::setLastName,
contestant1::setStreetNumber
);
Iterator<String> label = labels.iterator();
for(Function<String, Void> setter : setters) {
do {
try {
flag = false;
System.out.println(label.next());
String value = Scanner.nextLine();
setter.apply(value);
} catch (InvalidInputException e) {
System.out.println(e.getMessage());
flag = true;
}
} while (flag);
}
String[] setMethodNames={"FirstName","LastName","Street"};
Class cls = Class.forName("<qualifiedname>Contestant");
Class parameterTypes = String.class;
for(String s:setMethodNames){
do{
try{
flag=false;
System.out.println("Please enter your "+s+" :");
String inp=scanner.nextLine();
cls.getDeclaredMethod("set"+s, parameterTypes ).invoke(contestant1, inp);
}catch(InvalidInputException e){
System.out.println(e.getMessage());
flag = true;
}
}while(flag);
}
你也可以使用反射并调用setter
你好,我有一堆 do while 语句用于我正在制作的程序,每个语句都有一个不同的 setMethod 在另一个 class 中定义,但是我想以更紧凑的方式执行此操作。我想知道某种循环是否可以做到这一点。或者如果你可以有一个 setMethod 数组。或者任何可以使此代码紧凑的东西。
contestant1 is an object of the class contestant information which contains the set methods for each field.
do {
try {
flag = false;
System.out.println("Please enter your first name.");
String firstName = Scanner.nextLine();
contestant1.setName(firstName);
} catch (InvalidInputException e) {
System.out.println(e.getMessage());
flag = true;
}
} while (flag);
do {
try {
flag = false;
System.out.println("Please enter your last name.");
String lastName = Scanner.nextLine();
contestant1.setLastName(lastName);
} catch (InvalidInputException e) {
System.out.println(e.getMessage());
flag = true;
}
} while (flag);
do {
try {
flag = false;
System.out.println("Please enter your street number.");
String streetNumber = Scanner.nextLine();
contestant1.setStreetNumber(streetNumber);
} catch (InvalidInputException e) {
System.out.println(e.getMessage());
flag = true;
}
} while (flag);
String[] setMethodNames={"First Name","Last Name","Street"};
for(String s:setMethodNames){
do{
try{
flag=false;
System.out.println("Please enter your "+s+" :");
String inp=scanner.nextLine();
callSetFunction(contestant1,s,inp);
}catch(InvalidInputException e){
System.out.println(e.getMessage());
flag = true;
}
}while(flag)
}
private void callSetFunction(Contestant contestant1,String s,String inp){
switch(s){
case "First Name":
contestant1.setFirstName(inp);
break
case "Last Name":
contestant1.setLastName(inp);
break;
case "Street":
contestant1.setStreet(inp);
break;
default:
//do something
}
}
如果您使用的是 Java 8,您可以这样做:
List<String> labels = Arrays.asList(
"Please enter your first name.",
"Please enter your last name.",
"Please enter your street number."
);
Function<String, Void> setters = Arrays.asList(
contestant1::setName,
contestant1::setLastName,
contestant1::setStreetNumber
);
Iterator<String> label = labels.iterator();
for(Function<String, Void> setter : setters) {
do {
try {
flag = false;
System.out.println(label.next());
String value = Scanner.nextLine();
setter.apply(value);
} catch (InvalidInputException e) {
System.out.println(e.getMessage());
flag = true;
}
} while (flag);
}
String[] setMethodNames={"FirstName","LastName","Street"};
Class cls = Class.forName("<qualifiedname>Contestant");
Class parameterTypes = String.class;
for(String s:setMethodNames){
do{
try{
flag=false;
System.out.println("Please enter your "+s+" :");
String inp=scanner.nextLine();
cls.getDeclaredMethod("set"+s, parameterTypes ).invoke(contestant1, inp);
}catch(InvalidInputException e){
System.out.println(e.getMessage());
flag = true;
}
}while(flag);
}
你也可以使用反射并调用setter