Java – how do I overload methods in an interface?

If I had this interface

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

I want to be able to pass 1 or 2 strings to the getValue method without overwriting them in each implementation class

public class SomeClass1 impelments someInterface 
{
 @Override
 public String getValue(String arg1);
}

public class SomeClass2 implements someInterface 
{
 @Override
 public String getValue(String arg1,String arg2);
}

This does not work because someclass1 needs to implement method 2 and someclass2 needs to implement method 1

Do I insist?

public interface someInterface2 {
  public String getValue(String... args);
}

public class SomeClass3 implements someInterface2 
{
  @Override
  public String getValue(String... args) {
    if (args.length != 1) {
      throw IllegalArgumentException();
    }
    // code
  }
}

public class SomeClass4 implements someInterface2
{
  @Override
  public String getValue(String... args) {
    if (args.length != 2) {
      throw IllegalArgumentException();
     }
    // code
  }
}

someInterface2 someClass3 = new SomeClass3();
someInterface2 someClass4 = new SomeClass4();
String test1 = someClass3.getValue("String 1");
String test2 = someClass4.getValue("String 1,"String 2");

Is there a better way?

Solution

Interface is used as a contract for the user of the interface: specify the available methods (in all implementations) and how to call them If two implementations of an interface require different methods, the 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 the implementation you are using, so you only need to call the correct 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 methods

If your class program is more generic and uses dependency injection, you may not know which implementation you have Then, I will create a new interface key, which can be any 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;
    // ...
}

Dependency injection in programs may come from some factory implementations Since you cannot know which type of lookup to use, you need a getValue contract

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()));
    }
}
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>