Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.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_Arraylist_Overloading - Fatal编程技术网

Java 在这种情况下使用重载错误吗?

Java 在这种情况下使用重载错误吗?,java,arraylist,overloading,Java,Arraylist,Overloading,我有一个列出ArrayList元素的方法,通常它打印全局变量ArrayList的组件,但在一个特定实例中,我需要它打印局部变量的组件 所以我有这个 public static void listPlayers(ArrayList<Player> characters, boolean beingRolled) { //print character components (beingRolled specifies which parts of each players to

我有一个列出ArrayList元素的方法,通常它打印全局变量ArrayList的组件,但在一个特定实例中,我需要它打印局部变量的组件

所以我有这个

public static void listPlayers(ArrayList<Player> characters, boolean beingRolled) {
    //print character components (beingRolled specifies which parts of each players to print
}
其中players是全局变量

我考虑的另一件事是,在我想使用全局函数的任何地方,我都可以为字符传递一个空引用,并编写这个方法

public static void listPlayers(ArrayList<Player> characters, boolean beingRolled) {
    if (characters == null) characters = players;
    //print components
}
publicstaticvoidlistplayers(arraylistcharacters,boolean-beingrolling){
如果(characters==null)characters=players;
//打印组件
}

哪个版本更专业/推荐?

第一个版本更好,因为它更容易让其他人理解。当函数的参数全部列出时,调用方可以更容易地预测函数将执行的操作。如果函数依赖于不可见的变量,例如,如果在没有源代码的库中可以使用这些变量,则调用方将无法理解函数为何以意外方式运行。如果没有好的文档,这是不可能理解的

一般情况下,远离null;重载方法签名是一种更好的方法

也就是说,你说的一件事很可怕——你有一个对全局变量操作的静态方法。总的来说,这是个坏主意。您应该考虑重构以使用对象/类作用域状态,而不是全局、静态范围状态。 我甚至想说,您应该只使用将ArrayList作为参数的重载,每次都将全局变量传递给它。然后,即使你必须使用一个全局变量,至少你在少一个地方使用它


编辑:我大学时的一位教授写了一本关于重构的书,可读性很强,内容也很好(尽管排版有点奇怪)。Steve Halladay的《基于原则的重构:通过应用重构规则学习软件设计原则》。我强烈建议阅读前半部分(后半部分基本上是一个参考)。

如果您在每个调用站点都知道是否要输出全局或参数,那么第一个变量可能更可取。当您想要输出全局变量时传递null只会使事情变得模糊。在这种特殊情况下,您可能需要重新考虑全局变量的使用。为什么您甚至需要
公共静态void listPlayers(boolean beingroll)
?你不能直接调用
listPlayers(players,abitraryBoolean)直接?@NathanTuggy我使用的是一个全局(静态)变量,因为对象只有一个实例,而它是实际运行程序的对象。我有ArrayList的全局变量,它保存的文件,还有一个扫描器,只是因为我厌倦了在每个需要输入的方法中打开和关闭扫描器。main方法运行一个无限循环(直到用户键入“end”命令),该循环获取一个命令,然后调用修改、保存或打印ArrayList的方法。这是一种糟糕的做法吗?@Wasdo:在这种情况下,这可能是可以接受的做法,但如果你有时间担心重载是否是一种代码味道,你当然有时间担心全局变量。一般来说,我不使用非最终静态变量。听起来你是在为一个单身汉描述教科书上的用例;如果这是真的,那么是的,静态变量是可以接受的。但是,要意识到,如果您习惯于使用全局变量,这将限制您重用代码的能力,因为对于您希望在其中使用代码的下一个项目,单例变量通常不是正确的设计。
public static void listPlayers(ArrayList<Player> characters, boolean beingRolled) {
    if (characters == null) characters = players;
    //print components
}