Avoiding multiple If statements in Java

后端 未结 13 906
北恋
北恋 2020-12-30 07:52

I\'ve coded a method something like this. But I guess this should undergo refactoring. Can any one suggest the best approach to avoid using this multiple if statements?

13条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-30 08:09

    Command pattern is the way to go. Here is one example using java 8:

    1. Define the interface:

    public interface ExtensionHandler {
      boolean isMatched(String fileName);
      String handle(String fileName);
    }
    

    2. Implement the interface with each of the extension:

    public class PdfHandler implements ExtensionHandler {
      @Override
      public boolean isMatched(String fileName) {
        return fileName.endsWith(".pdf");
      }
    
      @Override
      public String handle(String fileName) {
        return "application/pdf";
      }
    }
    

    and

    public class TxtHandler implements ExtensionHandler {
      @Override public boolean isMatched(String fileName) {
        return fileName.endsWith(".txt");
      }
    
      @Override public String handle(String fileName) {
        return "txt/plain";
      }
    }
    

    and so on .....

    3. Define the Client:

    public class MimeTypeGetter {
      private List extensionHandlers;
      private ExtensionHandler plainTextHandler;
    
      public MimeTypeGetter() {
        extensionHandlers = new ArrayList<>();
    
        extensionHandlers.add(new PdfHandler());
        extensionHandlers.add(new DocHandler());
        extensionHandlers.add(new XlsHandler());
    
        // and so on
    
        plainTextHandler = new PlainTextHandler();
        extensionHandlers.add(plainTextHandler);
      }
    
      public String getMimeType(String fileExtension) {
        return extensionHandlers.stream()
          .filter(handler -> handler.isMatched(fileExtension))
          .findFirst()
          .orElse(plainTextHandler)
          .handle(fileExtension);
      }
    }
    

    4. And this is the sample result:

      public static void main(String[] args) {
        MimeTypeGetter mimeTypeGetter = new MimeTypeGetter();
    
        System.out.println(mimeTypeGetter.getMimeType("test.pdf")); // application/pdf
        System.out.println(mimeTypeGetter.getMimeType("hello.txt")); // txt/plain
        System.out.println(mimeTypeGetter.getMimeType("my presentation.ppt")); // "application/vnd.ms-powerpoint"
      }
    

提交回复
热议问题