2009-06-23 189 views
4

短,这可能是意译,如“继承与函数库”在java中扩展类funcionality的最佳方法是什么?

例如,我想一个方法添加到javax.servlet.http.HttpServletRequest,让我全身,一getBody( )方法,它将通过getReader方法读取主体,只是举个例子。

在其他语言,如Ruby或JavaScript,你可以添加一个方法的基类,甚至是特定的实例,但在Java中我看到这两个选择......

  1. 延伸的HttpServletRequest (类似MyHttpServletRequest)并添加方法

  2. 或创建HttpServeletHelper静态类,具有静态方法,具有以下方法

公共静态字符串HttpServeletHelper.getBody(HttpServletRequest请求)

第一种方法更面向对象,优雅,但强迫你在每次需要时都施放对象,并且不知何故你必须告诉jsp使用你的类...

第二种方法仅仅是一个良好的老函数库......取决于你如何看待它,这可能是一个好事还是坏事?

什么优点/缺点你在看每种方法,哪一种更适合这种情况?

在此先感谢

saludos

SAS

回答

2

您的特定示例至少存在一个问题:servlet/JSP引擎不会知道或关心您的子类。他们只会处理HttpServletRequest。我想你可以把它包起来并施展它,但我几乎不会称之为“优雅”。

你甚至不会引用另一种可能性:构图。您可以拥有一个非静态的类,它将HttpServletRequest作为ctor参数,并将其作为ServletRequest方法的实现。您添加额外的getBody调用来执行您的专门行为。

也许读this会有所帮助。

还有其他关于偏好合成而不是继承的问题。看看你对这些的看法。

我会和这个特殊的例子一起帮助者类,但上帝禁止单身人士。这不是真的必要或不可取。

这个例子感觉特别尴尬。这真的是你想要做的吗?

+0

Jinx!发布相同的链接。 – Apocalisp 2009-06-23 01:11:19

1

这取决于你打算如何使用类哪个选项,我会选择。一方面,如果你打算把这个类插入已经使用HttpServletRequest的现有处理管道中,我会选择继承方法。

对于所有其他情况(我现在可以看到),我会选择助手类。但是,我不会让它成为静态的,因为静态方法非常难以测试。相反,我会用一个静态的getter来实现某种形式的Singleton模式。

+1

我同意,这取决于你打算如何使用它,但在大多数情况下,辅助类是最好的选择。我主张创建一个助手实例并在需要时注入它,而不是单例 - 但这是我的首选 – rojoca 2009-06-23 01:16:12

+0

@rojaca:哦,我同意,这可能是实现助手的最佳方式;辛格尔顿高度过度使用IMO。但是...因为这是针对Java的,如果一个模式定义了Java,那么它就是Singleton模式,我认为......呃,你知道的。 :) – Randolpho 2009-06-23 02:21:38

5

我会选择#2。 HttpServletRequest是框架的一部分,所以Tomcat(或其他)将实例化它并将其交给你的代码。你不会选择是否使用你的子类。 (实际上,随着Servlet,EJB等框架的兴起,我发现这个问题相当普遍。)

另外,最近有很多关于过度依赖继承的反模式。在Java中,继承是一个“稀缺资源”:对于每个类,你只需要做一次。你应该为真正的“子类”保留继承,而不仅仅是在这里和那里添加一些功能。

2

See GoF on Composition vs Inheritance。从设计模式书中拿走的一件事是总是偏爱合成而不是继承。继承感觉更“优雅”的原因是类型系统已经隐式地从你的子类型转换为超类型。但是你遇到了一个限制,因为你将自己锁定在一个变得极度抗拒的特定层次结构中。

在需要多态性的地方,通过泛型使用参数多态,而不是通过子类化使用隐式类型多态。

相关问题