(Java)重载:多少钱太多了?

时间:2013-10-28 19:31:11

标签: java methods overloading jcl

我正在使用Java来生成JCL。我有四种方法来添加数据定义语句。一个接受一个字符,一个字符串,一个数组(字符串),另一个接受第二个参数。

public void addDD (String label, char classChar) //Generates: SYSIN DD SYSOUT=[classChar]
public void addDD (String label, String dataset) //Generates: SYSIN DD DSN=[dataset]
public void addDD (String label) //Generates: SYSIN DD DUMMY
public void addDD (String label, String datasets[]) //Generates: SYSIN DD *
                                                    // DSN=[datasets[0]],
                                                    // DSN=[datasets[1]]

我担心的是这些方法不仅仅接受不同的参数类型;整个方法根据类型而变化。如果是字符串,则需要“DSN =”。如果它是一个char,你需要“SYSOUT =”。同时,我不希望客户担心为每种情况使用不同的方法名称。

我目前的设计是不好的做法还是好的?

4 个答案:

答案 0 :(得分:0)

这些决定总是部分是品味问题。

在这种特殊情况下,我宁愿更改方法名称,因为它们确实做了不同的事情。大多数时候这样的重载方法只是方便:拥有char或String变体主要意味着char将被转换为字符串并且效果将是相同的,在您的示例中不是这种情况。

执行此操作可能还有其他原因(使用反射来查找正确的方法),但在这种情况下,我建议编写清晰的Javadoc来描述方法实际上是为了避免混淆。

答案 1 :(得分:0)

你正在做的事情是非常危险的 - 你依靠addDD(String, char)的来电者来阅读javadoc并找出他不应该使用addDD(String, String)

选项1 :重命名方法:addDDSysout()addDDDsn()等。

Option2 :只需一个方法即可实现所有这些功能:

addDD(String label, String... args)

并使非常肯定你可以处理抛出的任何东西 - args中没有字符串,单个字符串,多个字符串,单个字符等。

答案 2 :(得分:0)

我必须同意这些事情往往是品味问题。但我不确定其他响应者是否理解JCL DD声明的重要性。因为我根据你的问题领域不同意他们。

我喜欢你的设计。我会劝阻不同的方法名称。这基本上是TSO用FILE(xxx)和DSN(xxx)做的事情,我总是讨厌它。虽然您的方法在输入阅读器流中产生不同的“结果”,但这些差异是由JCL的语法强制的。更具体地说,他们不会做不同的事情。从根本上说,您正在向批处理作业声明数据源/接收器。不要让用户学习4种不同的方法来做到这一点。

答案 3 :(得分:0)

涵盖所有DD语句结构所需的方法签名数 可能会变得非常混乱。

例如,我不太确定该方法:

public void addDD (String label, String datasets[]) 

生成:

//SYSIN DD *
// DSN=[datasets[0]],
// DSN=[datasets[1]]...

工作得很好,DD *表示要跟踪的内联数据,这需要 在连接其他数据集(如果有)之前以/*终止。以上方法 应该生成一系列简单的DD语句,如下所示:

//SYSIN DD
// DSN=[datasets[0]],
// DSN=[datasets[1]]...

您将使用哪种签名来生成内联数据集?可能是一样的 事情:

public void addDD (String label, String inlinedata[])

生成:

//SYSIN DD *
inlinedata[0]
inlinedata[1]...
/*

但两种方法都有相同的签名 - 这是行不通的。你可能最好使用多个 避免签名冲突的方法。或者,如果继续使用重载的单个方法,那么 在深入沼泽之前,请确保已覆盖所有可能的DD名称构造。

无论哪种方式,这都需要为最终用户提供大量文档 感觉(JCL可以成为一种真正的脚本语言狗)。