1

如果为某个方法添加第三个签名,是否让第二个和第三个变体直接调用第一个变体(实现的变体),还是让第三个调用为第二个,第二个为第一个。重载标准协议的方法?

在我看来,额外的方法调用将会是你可能没有的开销,所以你希望所有的方法直接调用已实现的方法。

我想知道是否有人知道这样做的任何“标准推荐方式”,或者如果它更个人的偏好或取决于上下文。当我向现有的重载方法添加一个新签名时,我一直很好奇。你几乎总是可以选择以哪种方式来做到这一点。

哀婉愚蠢的例子:

现有的方法:

public String concatenate(String one, String two, String three) { 
    return(one+two+three); 
} 

public String concatenate(String one, String two) { 
    return(concatenate(one, two, "")); 
} 

要添加下一个,我该怎么办:

public String concatenate(String one) { 
    return(concatenate(one,"","")); 
} 

OR

public String concatenate(String one) { 
    return(concatenate(one,"")); 
} 

,是的,我知道的最后的方法本质上是没有操作的。

+0

Java对吧?您可能希望使用您正在使用的语言标记。 – torak 2010-09-01 16:40:50

+0

嗯,我不认为它专门应用于Java,看起来像一个适用于任何支持超载的语言的问题。 – 2010-09-02 12:35:18

回答

2

我更喜欢在可能的情况下创建一个所有其他加载器调用的私有方法。

private String _concatenateBase(String one, String two) 
{ 
    return one + two; 
} 


public String concatenate(String one, String two, String three) 
{ 
    return _concatenateBase(one+two, three); 
} 
+0

这可能与我如何去做有关,但可能不是私有的,因为基本方法可能是在添加新签名时最初公开的方法。另外,我很好奇你为什么重命名私有方法。 – 2010-09-02 12:37:13

+0

在我看来,重载是一种表达“做不同的投入来做同样的事情”的概念的方式。这对班级的客户来说非常有用:他们知道所有连接方法通过读取名称来完成的。 但是在(我的)基本方法是私有的情况下(也许比这个例子稍微复杂一点),我认为它做了不同的事情:它实现了行为,而其他方法*使用该实现。 当然这是一个几乎没有意义的细节:) – vulkanino 2010-09-02 16:04:18

1

我会通常使用较少的参数重载调用具有更多参数的重载,填充默认值。我怀疑我通常会尽量避免重复默认设置,所以我会让你的第三个变体称为第二个变体,这将称之为第一个变体。但是,这绝对取决于确切的情况。在某些情况下,性能将是一个重要因素,但通常可读性要重要得多。在大多数情况下,我怀疑在可读性方面会有很大的差异,特别是如果默认值很简单的话。

当然,在某些情况下,重载不是以这种线性方式构造的:可能有几个重载都称为同一个“核心”重载,但如果它们提供的是不同的参数。