2016-04-08 19 views
0

考虑以下的调整。用户可以输入诸如30D,90D,180D,360D,1M,3M,6M,12M,1Y (D =日,M =月,Y =年)之类的东西。“利用”java调用值是明智的

我想用以下两种方法计算月数。

private int getLengthOfPeriodInMonths(Integer lengthOfPeriod, String unitOfPeriod) { 
     int periodInMonths = lengthOfPeriod; 
     if ("D".equals(unitOfPeriod)) { 
      periodInMonths = lengthOfPeriod/30; 
     } else if ("Y".equals(unitOfPeriod)) { 
      periodInMonths = lengthOfPeriod * 12; 
     } 
     return periodInMonths; 
    } 

    private int getLengthOfPeriodInMonths(Integer lengthOfPeriod, String unitOfPeriod) { 
     if ("D".equals(unitOfPeriod)) { 
      lengthOfPeriod = lengthOfPeriod/30; 
     } else if ("Y".equals(unitOfPeriod)) { 
      lengthOfPeriod = lengthOfPeriod * 12; 
     } 
     return lengthOfPeriod; 
    } 

由于Java的可与呼叫按值与作为值传递一个参考lengthOfPeriod不会外部改变的方法的。我不确定什么更适合使用。

我知道这种方法可以通过使用enum Periods或类似的东西来重构。但我们不要在此讨论这一点。

+0

你能解释一下什么是应该发生在这里? – SomeJavaGuy

+0

做哪一个让你的代码更清晰。对我来说,他们都很好。 – khelwood

+0

我认为可能有一个一般问题:程序员可能会改变第二种方法中的lengthOfPeriod(通过setter),这可能会改变此方法之外的代码。 – Chris311

回答

3

分配给方法参数不是一个好主意(他们应该已经在默认情况下作为最终的恕我直言)。如果你真的想避免额外的变量(不是真的有区别),你可以把回报放在你的if子句中。

但不要将参数用作“自动局部变量”。它可能很难看到错误,并且不会让代码更具性能。

+0

我喜欢这个答案。你能否提供一个会产生错误的例子?在传递的引用中使用setter-call时,你的意思是什么? – Chris311

+0

@ Chris311 *“你能提供一个例子来说明它会产生一个bug吗?”*例如'public void setBlub(String blub){blub = blub;}'这里程序员将参数赋值给自己,而不是使用领域。或者当程序员认为,重新分配参数将反映到调用方法,如:'String blub; setBlub(泡壳); .... public void setBlub(String blub){blub =“default”; }'。通过设置参数'final',你可以避免这个问题。 – Tom

+1

@ Chris311好吧,不是特别的,但当然这也是一个潜在的问题。大多数方法*不会*分配给参数,因此如果您要更改方法,则更容易忽视。如果参数需要以某种方式进行预处理,那么当它们具有最初的参数时,会更加一致,并且可以使用局部变量。 – Kayaman

0

唯一的区别是您在第一个方法中使用自己的变量int periodInMonths = lengthOfPeriod;。但这不是必要的!

您可以使用第二个..它做它应该做的!

int lengthOfPeriodInMonths = getLengthOfPeriodInMonths(lengthOfPeriod, unitOfPeriod); 

,你必须计算出INT存储在lengthOfPeriodInMonths

PS的方法之外:该调用

lengthOfPeriod = lengthOfPeriod/30; 

相当于

lengthOfPeriod = new Integer(lengthOfPeriod/30); 

(看“自动拳击“在Java)。

因此,如您所说,Java使用call-bay-value。在此调用中变量lengthOfPeriod被分配了一个新的引用。所以这个计算会在方法之外丢失!这就是为什么你必须返回新计算的值!

+0

这正是我已经知道的,但放弃使用局部变量是明智的吗? – Chris311

+0

是的,因为你的程序的执行速度稍慢一点,它会减少你的工作内存等;)AND:为什么添加一些不需要的东西? – mrbela

+1

@mrbela它对性能没有影响。这就是所谓的*微型优化*,你专注于那些真正无关紧要的事情,但可能会编写错误的代码。代码清晰度远远超过“保存”局部变量。最好把注意力集中在比“想要使用1个变量还是2个”更重要的事情上。 – Kayaman

0

首先建议:永远不要修改方法参数。他们应该始终反映方法用户传递的价值。第二个建议:如果有人建议你永远不要做某些事情,特别是如果他或她使用“永远不会”这个短语,请用一粒盐来听取他或她的建议。没有例外的规则(从来没有;-)。这些规则是伟大的经验法则,但总是使用自己的判断。选择你认为更清晰的解决方案。我知道某些情况下,我发现修改方法参数比替代方法更具可读性。

例如,有时您可能希望允许该方法的用户将null传递给方法,但将其替换为某个默认值。我发现下面的方法

public void doSomething(String s) { 
    if (s == null) s = ""; 
    System.out.println(s); 
} 

不是引入一个局部变量只以包括缺省值更清楚:

public void doSomething(final String s) { 
    String sOrEmpty = s == null ? "" : s; 
    System.out.println(sOrEmpty); 
}