简体   繁体   English

如何重构 Java 中的多个 if-else 语句?

[英]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”变量包含一个用于匹配相关行的字符串。

Simplify简化

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 

Improve提升

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM