【发布时间】:2012-11-13 20:33:42
【问题描述】:
我有一个来自另一个闭源库的类,但我希望能够为它使用接口。原因是我不想到处做instanceof 检查或null-checks,但我也不想扩展现有的类。
例如,假设我有这个代码:
public class Example {
// QuietFoo is from another library that I can't change
private static QuietFoo quietFoo;
// LoudFoo is my own code and is meant to replace QuietFoo
private static LoudFoo loudFoo;
public static void main(String[] args) {
handle(foo);
}
private static void handle(Object foo) {
if (foo instanceof QuietFoo)
((QuietFoo) foo).bar();
else if (foo instanceof LoudFoo)
((LoudFoo) foo).bar();
}
}
我改不了QuietFoo:
public class QuietFoo {
public void bar() {
System.out.println("bar");
}
}
但是我可以改变LoudFoo:
public class LoudFoo {
public void bar() {
System.out.println("BAR!!");
}
}
问题是,bar 在很多类中可能还有很多其他的实现,而且方法可能不止bar,所以不仅我的handle 方法会因为有很多@ 而变得缓慢而丑陋987654333@ 语句,但我必须为QuietFoo 和LoudFoo 上的每个方法编写这些句柄方法之一。扩展不是一个可行的解决方案,因为它违反了整个 is-a 合同,因为 LoudFoo 不是 QuietFoo。
基本上,给定Foo:
public interface Foo {
void bar();
}
如何让QuietFoo 在不更改其源代码的情况下实现Foo,这样我就不必在我的代码中到处进行转换和instanceof 调用?
【问题讨论】:
-
在任何人给我高炮之前:blog.stackoverflow.com/2011/07/…
-
@Gamb 在我的评论中阅读该博客文章 -.- 如果您将鼠标悬停在“x 分钟前”上,从技术上讲,您会看到完全相同的时间:3
-
啊,好吧。当您发布问题时,您可以选择“回答您自己的问题”(this page 底部的复选框),这也可以让您输入答案。这就是我让它在同一时间提交的方式。我使用“你”是为了让人们以对话的方式查看它,使其更易于阅读。
-
我知道。它把它变成一个维基条目而不是一个问答(恕我直言)。不用担心,这是一个很酷的答案,但我的评论似乎属于元问题而不是这里:)
-
@Gamb 如果您对 meta 提出问题,请告诉我您的发现。
标签: java interface adapter instanceof proxy-classes