[英]How do I refactor multiple if-else statements in Java?
How do I refactor all this code that seems repetitive and too long, is there a way to make it shorter?我如何重构所有这些看起来重复且太长的代码,有没有办法让它更短?
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
}
I have tried using the Switch statement but that does not work in this circumstance.我曾尝试使用 Switch 语句,但在这种情况下不起作用。
the "typeOfData" variable holds a String that is used to match relevant lines. “typeOfData”变量包含一个用于匹配相关行的字符串。
You can extract the common lines, before or after the ifs
您可以在
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
You could imagine the constructors to take the Scanner
as parameter like您可以想象构造函数将
Scanner
作为参数,例如
public Book(Scanner sc) {
readData(sc);
}
Then the ifs becomes那么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));
}
Or a switch
或者一个
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));
}
This is the closest i could get:这是我能得到的最接近的:
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();
maybe you could use a factory method in the LibraryItem class.也许您可以在 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();
}
}
and then接着
System.out.println(lineOfText);
Scanner scanner2 = new Scanner(lineOfText);
LibraryItem libraryItem = LibraryItem.from(typeOfData);
libraryItem.readData(scanner2);
storeItem(libraryItem);
scanner2.close(); // ends scanner2
EDIT编辑
I ve just seen that probably LibraryUser do not extends LibraryItem.我刚刚看到可能 LibraryUser 不扩展 LibraryItem。 But maybe you could extract an interface for the method readData(Scanner s) and apply the same pattern
但也许你可以为方法 readData(Scanner s) 提取一个接口并应用相同的模式
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.