实现相同接口的多个类的方法相同

时间:2014-08-31 21:13:48

标签: java interface abstract-class

对不起,我真的不知道如何标题,这就是问题...

我有一个接口和多个实现该接口的类。接口中某些方法的实现在每个实现类中都是完全相同的。我觉得应该有一种简化方法,所以我不必每次都写相同的代码。例如:

public interface Foo {
    String getName();
}

public class FooImpl1 implements Foo {
    private String name = "foo name1";

    public String getName() {
        return name;
    }
}

public class FooImpl2 implements Foo {
    private String name = "foo name2";

    public String getName() {
        return name;
    }
}

所以要打破..

  1. 有没有办法将getName的代码放在一个地方,每个类都有自己的名称变量?

  2. 有没有办法让getName保持静态,所以我不必创建新实例

  3. 有更好的想法吗?

3 个答案:

答案 0 :(得分:11)

使用抽象类并在构造函数中初始化字段:

public abstract class Foo {

 protected String name;

 String getName() {
  return name;
 }
}

public class FooImpl1 extends Foo {

 public FooImpl1 () {
  name = "foo name1";
 }
}

public class FooImpl2 extends Foo {

 public FooImpl1 () {
  name = "foo name2";
 }
}

JB Nizlet指出做这样的事情会更干净:

public abstract class Foo {

protected String name;

public Foo(String newName) {
    name = newName;
}

 String getName() {
  return name;
 }
}

然后在子类中调用super("foo name 1")

正如@Peter Lawrey所说,如果您已经有一个界面或者出于其他原因想要一个界面:

public interface IFoo {
 String getName();
}

public abstract class Foo implements IFoo {

 protected String name;

 String getName() {
  return name;
 }
}

答案 1 :(得分:1)

你可以采取一种非常简单的方法:

public interface Foo {

    String getName();
}

public class Named implements Foo {

    String name;

    public String getName() {
        return name;
    }
}

public class FooImpl1 extends Named {
    {name = "foo name1";}
}

public class FooImpl2 extends Named {
    {name = "foo name2";}
}

答案 2 :(得分:0)

对于像你的例子中的getter一样,它并没有真正起作用,但由于问题更通用,我认为值得一提的是,使用Java 8,你可以定义default methods in interfaces。所以,如果你有一些更复杂的东西,比如:

public interface ComplexFoo {
    String getFirstName();
    String getLastName();

    String getFullName();
}

您不必在每个子类中重复getFullName实现,但可以在界面中指定它:

public interface ComplexFoo {
    String getFirstName();
    String getLastName();

    default String getFullName() {
        return getFirstName() + " " + getLastName();
    }
}

getter虽然仍然需要重复,因为他们访问界面中尚未提供的成员:

public class FooImpl1 implements ComplexFoo {
    private String firstName = "foo";
    private String lastName = "name1;

    private String getFirstName() { return firstName; }
    private String getLastName() { return lastName; }
}

public class FooImpl2 implements ComplexFoo {
    private String firstName = "foo";
    private String lastName = "name2;

    private String getFirstName() { return firstName; }
    private String getLastName() { return lastName; }
}