如何在 Java 中重构多个 if-else 语句?
How do I refactor multiple if-else statements in Java?
如何重构所有这些看起来重复且太长的代码,有没有办法缩短它?
if (typeOfData.equals("Book data"))
{
System.out.println(lineOfText);
Scanner scanner2 = new Scanner(lineOfText);
LibraryItem libraryItem = new Book();
libraryItem.readData(scanner2);
storeItem(libraryItem);
scanner2.close(); // ends scanner2
}
else if (typeOfData.equals("Periodical data"))
{
System.out.println(lineOfText);
Scanner scanner2 = new Scanner(lineOfText);
LibraryItem libraryItem = new Periodical(); // LibrayItem => Periodical(subtype)
libraryItem.readData(scanner2);
storeItem(libraryItem);
scanner2.close(); // ends scanner2
}
else if (typeOfData.equals("CD data"))
{
System.out.println(lineOfText);
Scanner scanner2 = new Scanner(lineOfText);
LibraryItem libraryItem = new CD(); // LibrayItem => CD(subtype)
libraryItem.readData(scanner2);
storeItem(libraryItem);
scanner2.close(); // ends scanner2
}
else if (typeOfData.equals("DVD data"))
{
System.out.println(lineOfText);
Scanner scanner2 = new Scanner(lineOfText);
LibraryItem libraryItem = new DVD();
libraryItem.readData(scanner2);
storeItem(libraryItem);
scanner2.close(); // ends scanner2
}
else if (typeOfData.equals("Library User data"))
{
System.out.println(lineOfText);
Scanner scanner2 = new Scanner(lineOfText);
LibraryUser libraryUser = new LibraryUser();
libraryUser.readData(scanner2);
storeUser(libraryUser);
scanner2.close(); // ends scanner2
}
我试过使用 Switch 语句,但在这种情况下不起作用。
“typeOfData”变量包含一个用于匹配相关行的字符串。
简化
您可以在 ifs
之前或之后提取公共行
System.out.println(lineOfText);
Scanner scanner2 = new Scanner(lineOfText);
if (typeOfData.equals("Book data")) {
LibraryItem libraryItem = new Book();
libraryItem.readData(scanner2);
storeItem(libraryItem);
} else if (typeOfData.equals("Periodical data")) {
LibraryItem libraryItem = new Periodical(); // LibrayItem => Periodical(subtype)
libraryItem.readData(scanner2);
storeItem(libraryItem);
} else if (typeOfData.equals("CD data")) {
LibraryItem libraryItem = new CD(); // LibrayItem => CD(subtype)
libraryItem.readData(scanner2);
storeItem(libraryItem);
} else if (typeOfData.equals("DVD data")) {
LibraryItem libraryItem = new DVD();
libraryItem.readData(scanner2);
storeItem(libraryItem);
} else if (typeOfData.equals("Library User data")) {
LibraryUser libraryUser = new LibraryUser();
libraryUser.readData(scanner2);
storeUser(libraryUser);
}
scanner2.close(); // ends scanner2
改善
您可以想象构造函数将 Scanner
作为参数,例如
public Book(Scanner sc) {
readData(sc);
}
那么ifs就变成了
if (typeOfData.equals("Book data")) {
storeItem(new Book(scanner2));
} else if (typeOfData.equals("Periodical data")) {
storeItem(new Periodical(scanner2));
} else if (typeOfData.equals("CD data")) {
storeItem(new CD(scanner2));
} else if (typeOfData.equals("DVD data")) {
storeItem(new DVD(scanner2));
} else if (typeOfData.equals("Library User data")) {
storeUser(new LibraryUser(scanner2));
}
或switch
switch (typeOfData) {
case "Book data" -> storeItem(new Book(scanner2));
case "Periodical data" -> storeItem(new Periodical(scanner2));
case "CD data" -> storeItem(new CD(scanner2));
case "DVD data" -> storeItem(new DVD(scanner2));
case "Library User data" -> storeUser(new LibraryUser(scanner2));
}
这是我能得到的最接近的:
System.out.println(lineOfText);
Scanner scanner2 = new Scanner(lineOfText);
if (typeOfData.equals("Book data"))
{
LibraryItem libraryItem = new Book();
libraryItem.readData(scanner2);
storeItem(libraryItem);
}
else if (typeOfData.equals("Periodical data"))
{
LibraryItem libraryItem = new Periodical(); // LibrayItem => Periodical(subtype)
libraryItem.readData(scanner2);
storeItem(libraryItem);
}
else if (typeOfData.equals("CD data"))
{
LibraryItem libraryItem = new CD(); // LibrayItem => CD(subtype)
libraryItem.readData(scanner2);
storeItem(libraryItem);
}
else if (typeOfData.equals("DVD data"))
{
LibraryItem libraryItem = new DVD();
libraryItem.readData(scanner2);
storeItem(libraryItem);
}
else if (typeOfData.equals("Library User data"))
{
LibraryUser libraryUser = new LibraryUser();
libraryUser.readData(scanner2);
storeUser(libraryUser);
}
scanner2.close(); // ends scanner2
System.out.println(lineOfText);
Scanner scanner2 = new Scanner(lineOfText);
LibraryItem libraryItem = null;
if (typeOfData.equals("Book data"))
{
LibraryItem libraryItem = new Book();
}
else if (typeOfData.equals("Periodical data"))
{
LibraryItem libraryItem = new Periodical();
}
else if (typeOfData.equals("CD data"))
{
LibraryItem libraryItem = new CD();
}
else if (typeOfData.equals("DVD data"))
{
LibraryItem libraryItem = new DVD();
}
else if (typeOfData.equals("Library User data"))
{
LibraryUser libraryUser = new LibraryUser();
}
if(libraryItem != null){
libraryItem.readData(scanner2);
storeItem(libraryItem);
}
scanner2.close();
或许您可以在 LibraryItem 中使用工厂方法 class。
class LibraryItem {
public static LibraryItem from(String typeOfData) {
if (typeOfData.equals("Book data")) {
return new Book();
}
if (typeOfData.equals("Periodical data")) {
return new Periodical();
}
if (typeOfData.equals("CD data")) {
return new CD();
}
if (typeOfData.equals("DVD data")) {
return new DVD();
}
if (typeOfData.equals("Library User data")) {
return new LibraryUser();
}
throw new IllegalArgumentException();
}
}
然后
System.out.println(lineOfText);
Scanner scanner2 = new Scanner(lineOfText);
LibraryItem libraryItem = LibraryItem.from(typeOfData);
libraryItem.readData(scanner2);
storeItem(libraryItem);
scanner2.close(); // ends scanner2
编辑
我刚刚看到 LibraryUser 可能没有扩展 LibraryItem。
但也许您可以为方法 readData(Scanner s) 提取接口并应用相同的模式
如何重构所有这些看起来重复且太长的代码,有没有办法缩短它?
if (typeOfData.equals("Book data"))
{
System.out.println(lineOfText);
Scanner scanner2 = new Scanner(lineOfText);
LibraryItem libraryItem = new Book();
libraryItem.readData(scanner2);
storeItem(libraryItem);
scanner2.close(); // ends scanner2
}
else if (typeOfData.equals("Periodical data"))
{
System.out.println(lineOfText);
Scanner scanner2 = new Scanner(lineOfText);
LibraryItem libraryItem = new Periodical(); // LibrayItem => Periodical(subtype)
libraryItem.readData(scanner2);
storeItem(libraryItem);
scanner2.close(); // ends scanner2
}
else if (typeOfData.equals("CD data"))
{
System.out.println(lineOfText);
Scanner scanner2 = new Scanner(lineOfText);
LibraryItem libraryItem = new CD(); // LibrayItem => CD(subtype)
libraryItem.readData(scanner2);
storeItem(libraryItem);
scanner2.close(); // ends scanner2
}
else if (typeOfData.equals("DVD data"))
{
System.out.println(lineOfText);
Scanner scanner2 = new Scanner(lineOfText);
LibraryItem libraryItem = new DVD();
libraryItem.readData(scanner2);
storeItem(libraryItem);
scanner2.close(); // ends scanner2
}
else if (typeOfData.equals("Library User data"))
{
System.out.println(lineOfText);
Scanner scanner2 = new Scanner(lineOfText);
LibraryUser libraryUser = new LibraryUser();
libraryUser.readData(scanner2);
storeUser(libraryUser);
scanner2.close(); // ends scanner2
}
我试过使用 Switch 语句,但在这种情况下不起作用。
“typeOfData”变量包含一个用于匹配相关行的字符串。
简化
您可以在 ifs
System.out.println(lineOfText);
Scanner scanner2 = new Scanner(lineOfText);
if (typeOfData.equals("Book data")) {
LibraryItem libraryItem = new Book();
libraryItem.readData(scanner2);
storeItem(libraryItem);
} else if (typeOfData.equals("Periodical data")) {
LibraryItem libraryItem = new Periodical(); // LibrayItem => Periodical(subtype)
libraryItem.readData(scanner2);
storeItem(libraryItem);
} else if (typeOfData.equals("CD data")) {
LibraryItem libraryItem = new CD(); // LibrayItem => CD(subtype)
libraryItem.readData(scanner2);
storeItem(libraryItem);
} else if (typeOfData.equals("DVD data")) {
LibraryItem libraryItem = new DVD();
libraryItem.readData(scanner2);
storeItem(libraryItem);
} else if (typeOfData.equals("Library User data")) {
LibraryUser libraryUser = new LibraryUser();
libraryUser.readData(scanner2);
storeUser(libraryUser);
}
scanner2.close(); // ends scanner2
改善
您可以想象构造函数将 Scanner
作为参数,例如
public Book(Scanner sc) {
readData(sc);
}
那么ifs就变成了
if (typeOfData.equals("Book data")) {
storeItem(new Book(scanner2));
} else if (typeOfData.equals("Periodical data")) {
storeItem(new Periodical(scanner2));
} else if (typeOfData.equals("CD data")) {
storeItem(new CD(scanner2));
} else if (typeOfData.equals("DVD data")) {
storeItem(new DVD(scanner2));
} else if (typeOfData.equals("Library User data")) {
storeUser(new LibraryUser(scanner2));
}
或switch
switch (typeOfData) {
case "Book data" -> storeItem(new Book(scanner2));
case "Periodical data" -> storeItem(new Periodical(scanner2));
case "CD data" -> storeItem(new CD(scanner2));
case "DVD data" -> storeItem(new DVD(scanner2));
case "Library User data" -> storeUser(new LibraryUser(scanner2));
}
这是我能得到的最接近的:
System.out.println(lineOfText);
Scanner scanner2 = new Scanner(lineOfText);
if (typeOfData.equals("Book data"))
{
LibraryItem libraryItem = new Book();
libraryItem.readData(scanner2);
storeItem(libraryItem);
}
else if (typeOfData.equals("Periodical data"))
{
LibraryItem libraryItem = new Periodical(); // LibrayItem => Periodical(subtype)
libraryItem.readData(scanner2);
storeItem(libraryItem);
}
else if (typeOfData.equals("CD data"))
{
LibraryItem libraryItem = new CD(); // LibrayItem => CD(subtype)
libraryItem.readData(scanner2);
storeItem(libraryItem);
}
else if (typeOfData.equals("DVD data"))
{
LibraryItem libraryItem = new DVD();
libraryItem.readData(scanner2);
storeItem(libraryItem);
}
else if (typeOfData.equals("Library User data"))
{
LibraryUser libraryUser = new LibraryUser();
libraryUser.readData(scanner2);
storeUser(libraryUser);
}
scanner2.close(); // ends scanner2
System.out.println(lineOfText);
Scanner scanner2 = new Scanner(lineOfText);
LibraryItem libraryItem = null;
if (typeOfData.equals("Book data"))
{
LibraryItem libraryItem = new Book();
}
else if (typeOfData.equals("Periodical data"))
{
LibraryItem libraryItem = new Periodical();
}
else if (typeOfData.equals("CD data"))
{
LibraryItem libraryItem = new CD();
}
else if (typeOfData.equals("DVD data"))
{
LibraryItem libraryItem = new DVD();
}
else if (typeOfData.equals("Library User data"))
{
LibraryUser libraryUser = new LibraryUser();
}
if(libraryItem != null){
libraryItem.readData(scanner2);
storeItem(libraryItem);
}
scanner2.close();
或许您可以在 LibraryItem 中使用工厂方法 class。
class LibraryItem {
public static LibraryItem from(String typeOfData) {
if (typeOfData.equals("Book data")) {
return new Book();
}
if (typeOfData.equals("Periodical data")) {
return new Periodical();
}
if (typeOfData.equals("CD data")) {
return new CD();
}
if (typeOfData.equals("DVD data")) {
return new DVD();
}
if (typeOfData.equals("Library User data")) {
return new LibraryUser();
}
throw new IllegalArgumentException();
}
}
然后
System.out.println(lineOfText);
Scanner scanner2 = new Scanner(lineOfText);
LibraryItem libraryItem = LibraryItem.from(typeOfData);
libraryItem.readData(scanner2);
storeItem(libraryItem);
scanner2.close(); // ends scanner2
编辑
我刚刚看到 LibraryUser 可能没有扩展 LibraryItem。 但也许您可以为方法 readData(Scanner s) 提取接口并应用相同的模式