Java2D和Swing是面向对象编程(OOP)的好例子吗?

3

过度使用继承?

Java Swing和Java2D在很大程度上依赖于继承。大多数人告诉我应该尽可能避免继承,只有在必要时才使用它。那么,在Java2D和Java Swing中广泛使用继承是否合理?

适配器模式

我听到了很多适配器模式的赞扬,也听到了很多批评。然而,我从中得出的结论是,只有在正确的地方使用适配器模式才被认为是好的设计。无关的适配器模式使用会导致阅读您代码的人皱眉。两个Java API中的适配器模式使用是否正确和相关?

单例模式

这两个API也倾向于使用相当数量的单例。这是好事吗?

问题

那么,Java2D API和Java Swing是面向对象编程接口的良好示例吗?我应该在我的代码中使用它们的技术吗?


Java除了继承之外没有其他技术,因此我无法理解任何Java API如何过度使用它。 - Puppy
2
整个Java API广泛使用继承,不仅仅是Swing和Java2D。而且在那里没有滥用。 - John Eipe
4
即使是Java也提供了比继承更多的设计工具,例如委托? - jmg
3个回答

2

我对此没有把握,但可以提供一些想法:

  • 继承:假设您更喜欢在Swing中使用接口和组合而不是重用继承,则需要做大量的转发(ComponentJComponent有数十个方法)。

  • 适配器模式:见上文。

  • 单例模式:它们适用于模拟系统中真正独特的部分(我同意java.awt.Desktop可以作为单例实现-尽管它使用了一个工厂方法)。

  • 整体设计:您可能选择根据结果来评判事物-Swing是强大、可扩展和广泛使用的。


1
我有一个朋友在使用Swing时经常抱怨它是一个抽象的泥潭。在运行时确定对象的行为需要拼凑一种奇怪的继承功能的拼贴图。从我所见到的来看,我倾向于同意这种看法。

你有没有考虑过GUI编程是一种奇怪的需求和情况的拼贴?是的,Swing很复杂,但另一方面,我可以在想要的地方插入我的功能,我的Swing GUI不受框架认为对于其事件模型或表格过滤等是一个好主意的限制。 - arcy

-1
继承是一个有用的编程概念,但很容易不恰当地使用。
当以下情况时,继承是一个好选择:
1.您的继承层次结构表示“is-a”关系而不是“has-a”关系。 2.您可以重用基类中的代码。 3.您需要将相同的类和方法应用于不同的数据类型。 4.类层次结构相对较浅,并且其他开发人员不太可能添加许多级别。 5.您想通过更改基类来对派生类进行全局更改。
一个微软文章here和另一篇好的文章here

1
这并没有真正回答问题。它似乎是关于继承的一个存量答案。 - Russ Hayward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接