3

我正在设计一个 API。它将有很多方法做同样的事情,但有不同的参数原语。

public void someMethod1(int x);
public void someMethod1(float x);
public void someMethod1(double x);
public void someMethod2(int x, int y);
...
public void someMethod3(int x, int y, int z);
...

由于原语,我必须复制和粘贴很多,我认为随着时间的推移,这是相当不可维护的。在方法和构造函数中避免使用原语是个好主意吗?例如,上面的替换将是:

public <T extends Number> void someMethod1(T x);
public <T extends Number> void someMethod2(T x, T y);
public <T extends Number> void someMethod3(T x, T y, T z);

编辑:

这有什么缺点?

4

4 回答 4

4

由于 Java 1.5 及更高版本中的自动装箱/自动拆箱,它将可用。您可以将 an 传递int给期望 an 的东西,Integer反之亦然,并且强制转换将自动发生。这同样适用于返回值。

请记住,在您的方法主体中,您对您的论点知之甚少,只知道它们是某种形式的Number. 仅当您不关心区分整数和浮点表示时,这才适用。

它不会提高你的表现——演员阵容会受到一些小的惩罚,但你不应该担心这一点,直到你发现你遇到了瓶颈。对于大多数应用程序,差异将是微不足道的。

是否使用 aList而不是数组实际上应该由您的设计决定,但通常建议使用 a List,除非必须需要数组。 Lists 往往更灵活,不需要调整大小,具有CollectionsAPI 的所有优点等。

于 2010-03-07T18:28:43.730 回答
2

要回答您关于List<T>vs.的问题T[],请公开有关实施的详细信息。

List<T>T[]因为您可以在不更改客户端代码的情况下更改 List 实现更易于维护。

如果客户端代码不应该修改列表,那Iterable<T>会更好,因为您不会公开任何有关您的实现细节并阻止迭代以外的操作。

于 2010-03-07T18:35:06.550 回答
1

API 是关于语义的,所以我认为问题的答案(我应该避免 API 设计中的原语)是它取决于你的 API 做什么。

int addOne(int integer)在语义上是一致的,并且不会出现很多维护问题,因为它反映了问题域。

Employee getEmployee(int empID)如果您的员工 ID 更改为字符串,则可能会被归类为不合适的并且会出现维护问题。

于 2010-03-07T18:32:37.303 回答
1

这是一种有效的模式,有时用于在模型-视图-控制器系统中定义属性。此外,如果您使用 -128 到 127 范围内的整数,如果您转换使用它们将被 Java 自动缓存,Integer.valueOf(int)这可以加快Integer创建速度。您还可以使用java.lang.Integer.IntegerCache.high始终至少为 127 的属性来增加缓存范围。自动装箱也可能会使用此整数缓存,但我不确定。如果您的课程设计用于高性能环境,我会考虑其他替代方案并使用原语。

于 2010-03-07T18:55:58.470 回答