How would I overload method in an interface?

前端 未结 4 847
一个人的身影
一个人的身影 2021-02-09 00:30

if I have this interface

public interface someInterface {
  // method 1
  public String getValue(String arg1);
  // method 2
  public String getValue(String arg1         


        
4条回答
  •  情歌与酒
    2021-02-09 00:49

    An interface serves as a contract for the users of that interface: you specify what methods are available (in all implementations) and how they are called. If two implementations of an interface need a different method, then that method should not be part of the interface:

    public interface Lookup {
    }
    
    public class MapLookup implements Lookup {
        public String getValue(String key) {
            //...
        }
    }
    
    public class GuavaLookup implements Lookup {
        public String getValue(String row, String column) {
            // ...
        }
    }
    

    In your program, you will know which implementation you use, so you can simply call the right function:

    public class Program {
        private Lookup lookup = new MapLookup();
    
        public void printLookup(String key) {
            // I hardcoded lookup to be of type MapLookup, so I can cast:
            System.out.println(((MapLookup)lookup).getValue(key));
        }
    }
    

    Alternative approach

    If your class Program is more generic and uses dependency injections, you may not know which implementation you have. Then, I would make a new interface Key, which can be either type of key:

    public interface Lookup {
        // ...
    
        public String getValue(Key key);
    }
    
    public interface Key {
    }
    
    public MapKey implements Key {
        private String key;
        // ...
    }
    
    public GuavaKey implements Key {
        private String row, column;
        // ...
    }
    

    The dependency injection in your program might come from some factory implementation. Since you cannot know which type of lookup you use, you need a single contract for getValue.

    public interface Factory {
        public Lookup getLookup();
        public Key getKey();
    }
    
    public class Program {
        private Lookup lookup;
    
        public Program(Factory factory) {
            lookup = factory.getLookup();
        }
    
        public void printLookup(Factory factory) {      
            System.out.println((lookup.getValue(factory.getKey()));
        }
    }
    

提交回复
热议问题