Java 8中接口的默认方法中使用的阴影变量

时间:2015-11-03 14:46:30

标签: java oop java-8

今天,我正在考虑为不同对象所需的常用功能编写更少代码的好方法。

继承可以完成这项工作,但是这些类将无法继承其他任何人,所以我选择了Interfaces。

所以我的界面具有一些对象所需的功能:

public interface Test {
    String message = "Hello from Interface!";

    default void printMessage() {
        System.out.println(message);
    }
}

然后我可以在任何对象中使用它而不必覆盖/编写任何代码,而不仅仅是在需要时调用方法:

public class TestingTest implements Test {

    public String message = "Hello from Class!";

    public TestingTest() {
        printMessage();
    }

    public static void main(String[] args) {
        new TestingTest();
    }
}

它就像一个魅力!但是......然后我想,如果我想要一些这些对象在不需要的情况下指定不同的消息(可选),我首先想到的是遮蔽接口变量,但它不起作用,默认方法继续使用接口中的变量而不是类变量(隐藏它)。

当然,解决方案是在接口中重载printMessage方法,以便它将消息作为参数接收,以便用户何时需要指定消息,但是还有更优雅的方法吗?有点像只是在课堂上声明一条新消息吗?

2 个答案:

答案 0 :(得分:3)

界面中的String messagestatic(AFAIK)。所以这个方案不起作用。

你可能会做一些事(丑陋):

default void printMessage(String... messages) {
    if (messages.length == 0) {
        messages = new String[] { "arrgg" };
    }
    System.out.println(messages[0]);
}

字段没有继承,因此该值只能来自像

这样的可覆盖方法
public String message() { return "..."; }

答案 1 :(得分:0)

你想要的是n个类中的功能,如果需要的话,它也应该是可修改的。 说实话,你的例子有点抽象,因此我的回答也是抽象的。

public interface Test {
    void printMessage();

    default void printMessage(String message) {
        System.out.println(message);
    }
}

public class TestingTest {
    private final test;

    public TestingTest(Test test) {
        this.test = test;
    }

    public void someMethod() {
        test.printMessage("Hello from class");
    }
}

此外,您将拥有一个实现接口并提供消息的类。通过这种方式,您可以对对象进行分组,更改消息,进行更复杂的日志记录,实际上您可以从外部看到依赖关系。

在我看来,你是在滥用界面。界面提供了从外部调用它的公共方法,但是你想在里面使用它们,就像它们是类的私有功能一样。 只需使用对象。