今天,我正在考虑为不同对象所需的常用功能编写更少代码的好方法。
继承可以完成这项工作,但是这些类将无法继承其他任何人,所以我选择了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方法,以便它将消息作为参数接收,以便用户何时需要指定消息,但是还有更优雅的方法吗?有点像只是在课堂上声明一条新消息吗?
答案 0 :(得分:3)
界面中的String message
为static
(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");
}
}
此外,您将拥有一个实现接口并提供消息的类。通过这种方式,您可以对对象进行分组,更改消息,进行更复杂的日志记录,实际上您可以从外部看到依赖关系。
在我看来,你是在滥用界面。界面提供了从外部调用它的公共方法,但是你想在里面使用它们,就像它们是类的私有功能一样。 只需使用对象。