Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重载真的是在Java中获取方法参数默认值的唯一方法吗?_Java_Default_Overloading - Fatal编程技术网

重载真的是在Java中获取方法参数默认值的唯一方法吗?

重载真的是在Java中获取方法参数默认值的唯一方法吗?,java,default,overloading,Java,Default,Overloading,我对Java以及Python和PHP都是新手,我习惯于函数参数的默认值 因此,我有一个编写方法的习惯,这些方法被设计为在稍微不同的情况下调用,在这些情况下,您只需要设置一些值。例如,在我的PHP代码中,当我使用工厂方法提供属性稍有不同的对象实例时,这是很常见的 在Java中,我似乎必须有一个方法,该方法需要所有参数,然后是几个重载的变体,这些变体将调用该方法,其中一些参数设置为默认值,一些参数由调用方提供。这是,好吧,但有时会让我紧张 我记得在一些简短的C++和ActionScript的浏览中,

我对Java以及Python和PHP都是新手,我习惯于函数参数的默认值

因此,我有一个编写方法的习惯,这些方法被设计为在稍微不同的情况下调用,在这些情况下,您只需要设置一些值。例如,在我的PHP代码中,当我使用工厂方法提供属性稍有不同的对象实例时,这是很常见的

在Java中,我似乎必须有一个方法,该方法需要所有参数,然后是几个重载的变体,这些变体将调用该方法,其中一些参数设置为默认值,一些参数由调用方提供。这是,好吧,但有时会让我紧张

我记得在一些简短的C++和ActionScript的浏览中,这已经让我恼火了。现在,更有经验的Java开发人员是否有一些捷径

在我看来,从技术上讲,所有帖子的总和都回答了这个问题:“是的,是的”。我在下面打开了一个维基帖子,收集各种备选方案,如果你愿意,请提供。我发现所有这些都非常有帮助,可以作为典型Java构造的灵感和学习示例。

参见varargs


(更新的URL;添加此注释是因为stackoverflow需要>30个字符)

另一个选项是生成器模式的变体-您有一个表示所有参数的类型,构造该类型的实例(相应地默认),设置所需的属性,然后将结果传递到原始方法,或者在“参数类型”中添加一个方法来为您调用该方法


您可以在标准库和类中看到这一点。

只要以面向对象的方式编写代码,就不会错过Java中的默认值。默认参数仅适用于过程编码样式

在OO中,状态不是通过方法/过程传递的,而是已经在您调用的对象中,或者作为参数传递的对象中。大多数情况下,方法中不需要超过1或2个参数

如果您想在使用对象之前配置它,您可以使用一个简单的构造函数来构造它,然后调用不同的setter。与调用具有多个参数的构造函数相比,这使代码更具可读性(因为您可以看到setter名称)。 如果新属性稍后出现,您可以将其添加到对象中,而无需修改现有的factory方法。

它看起来像是“是的,它是”,除了:

类似的效果可以通过Paul Whelan建议的方法实现,也可以通过定义一个额外的类型来实现,该类型将参数定义为具有Jon Skeet建议的适当默认值的字段。Boris Pavlović补充说,他的类型可以是一个内部静态类,将事物整齐地放在正确的位置

缺点(请注意,整个问题不是关于任何严重的影响,只是关于方便的调整):

Varargs似乎最适合传递形式非常相似且意义基本相同的可变长度值列表,例如名称列表。如果用于问题中所述的目的,该方法必须对列表进行各种检查,以便对其进行解释,这似乎不太方便,但不太方便


如果生成的类型可能有其他用途,而不仅仅是传递给一个特定的方法,或者当它是一组更复杂的参数时,携带参数的特殊类型似乎最有用。如果有2-4个参数,有些参数可能有默认值,重载似乎更方便一些,但这可能是个人喜好的问题。

尝试将您的思维过程从一种语言转换到另一种语言可能非常困难。正如其他人所指出的,你可以做一些变通的工作,也许可以得到你想要的。。。但是,您越早“接受”Java设计的工作方式,您在Java中的工作就会越好

我不得不做一些PHP的东西。。。我无法让它做我想做的事,这让我非常恼火。。。所以它是双向的

您将遇到的最大障碍很可能是静态键入。你可以尝试做一些事情来解决这个问题,但最终它们将是一个非常大的难题

在C++早期,人们试图说服C++的行为类似SimalTalk。结果不太好。在早期,如果java人试图获取他们的C++知识并在爪哇使用它…结果不太好(这让人倍感沮丧,因为两种语言表面上非常相似)


我的建议是,对于Java编码,要学会像Java开发人员而不是PHP开发人员那样编程


对于您眼前的问题,您是否真的应该从工厂重新调整不同的类,而不是使用不同的变量集创建相同类型的对象?

为了简化此过程,我创建了一个默认值注释和一个使用重载方法生成超类的注释处理器。例如:

protected void process(
    Processor processor,
    String item,
    @Default("Processor.Size.LARGE") Size size,
    @Default("red") String color,
    @Default("1") int quantity) {
        ...
}
生成(在生成的超类中)


--Scott

是的,oop的重载是java中使用默认参数的唯一方法。 但这是给你的技巧。 如果使用重载并希望使用默认参数。那你就完了

public void methodA(A arg1) { }
public void methodA( B arg2,) { }
public void methodA(C arg3) { }
public void methodA(A arg1, B arg2) { }
public void methodA(A arg1, C arg3) { }
public void methodA( B arg2, C arg3) { }
public void methodA(A arg1, B arg2, C arg3) { }
但是通过使用varargs

public class DefaultValue
{
 public static void main(String[] args)
  {
       defaultParameter();
       defaultParameter(true);
  }

  public static void defaultParameter(Boolean …gender)
  {
       boolean genderBoolean = false; // It is the default value you want to give
       if(1 == gender.length)
       {
            genderBoolean = gender[0]; // Overrided Value
      }
       System.out.println(genderBoolean);
 }
}
上面的代码输出将是

false
true

要了解更多类似的示例和解释,请访问

对我来说似乎是对varargs功能的滥用。如果参数的数量不同,但所有参数的含义相同,我觉得varargs是好的,就像这些示例中的名称列表一样。如果这些参数有不同的含义,你很快就必须进行大量的检查,这样实际上更干净,更容易过载。对吧?汉诺已经解释过了。varargs用于每个参数都是“同一事物的另一个”的情况,例如Arrays.asList(T…)。
false
true