通常情况下,方法对其参数施加约束,而类型系统无法对其进行描述.例如,方法可能要求某些参数为非null,或者某些int类型的参数为正数.可能还存在更复杂的前提条件,例如之前调用某个方法,或者某个对象处于某种状态.在Javadoc中记录这个的最佳方法是什么?
例如,假设我有以下公共库函数,其中参数不能为负数:
public void foo(int bar) {
if (bar < 0) {
throw new IllegalArgumentException("Negative bars cannot be food.");
}
...
}
Run Code Online (Sandbox Code Playgroud)
我希望以这样的方式记录它,使其从文档文本的其余部分"脱颖而出",以便文档读者立即知道它们必须查看的位置.目前,我通过向throwsJavadoc 添加子句来实现此目的:
/**
* Foos a bar.
* @param bar the bar to be food
* @throws IllegalArgumentException if bar is negative
*/
public void foo(int bar) {
...
Run Code Online (Sandbox Code Playgroud)
但是,这会将异常抛出到方法的规范中.现在,库用户可能在其代码中依赖于此行为.因此,如果我想以允许负参数的方式更改下一版本中的方法,我可能会破坏客户端的代码.
是否有任何最佳实践来记录Javadoc中的这类内容?我想到了:
public void foo(@NonNegative int bar)).但是,对于此,标准的注释集将是理想的,并且该标准集似乎不存在.我已经研究了在Java 8中编写基于流的代码,并注意到了一种模式,即我经常有一个列表,但需要通过对每个元素应用一个简单的映射将其转换为另一个列表.写完.stream().map(...).collect(Collections.toList())又一次,我记得我们已经List.forEach找到了,List.map但显然这个默认方法还没有添加.
为什么List.map()(EDIT:或List.transform()or List.mumble())没有添加(这是一个历史问题),是否有一个简单的速记使用默认运行时库中的其他方法做同样的事情,我没有注意到?
假设我有n个布尔值,其中n是一个相对较小的数字(3-5左右).假设值是类的属性,每个属性都可以独立设置或取消设置.因此,有2种ñ可能的组合.现在我想以类似开关的方式区分这些组合.目前,我通常做这样的事情:
int mask = (bool1 ? 1 : 0) +
(bool2 ? 2 : 0) +
(bool3 ? 4 : 0) +
... ;
switch (mask) {
case 0b000:
// all variables false
case 0b001:
// only bool1 true
case 0b011:
// only bool1 and bool2 true
...
}
Run Code Online (Sandbox Code Playgroud)
这样可以,但我发现它并不优雅.对于这样的案例,是否有一些最佳实践(Java)或Java习惯用法?
在许多网站中,我研究过scala比Java更快.我编写了代码来测试这两者之间的时差,但Scala需要更多时间.我不知道我是否犯了任何错误.如果我错了,请纠正我.
Scala代码
package com.first
import java.util.ArrayList
object Word extends App{
val absoluteResult = new ArrayList[Any]()
val before = System.currentTimeMillis()
var i =0
while (i<10000) {
i = i+1
val result = List("foo", 23, true).iterator
while (result.hasNext) {
absoluteResult.add(foo(result.next))
}
}
println("Took : "+(System.currentTimeMillis() - before)
+" ms, number of elements : "+absoluteResult.size)
def foo(obj : Any) =
obj match {
case _:String => "String"
case _:Boolean => "Boolean"
case _:Integer => "Integer"
case _ => throw new IllegalArgumentException()
}
} …Run Code Online (Sandbox Code Playgroud) 我有一个类似于下面的代码片段,
public ArrayList getReport(reportJDOList,accountType)
{
String abc = "";
for(ReportJDO reportJDO : reportJDOList)
{
if(accountType.equals("something")
abc = reportJDO.getThis();
else
abc = reportJDO.getThat();
//somecode goes here
}
returning List;
}
Run Code Online (Sandbox Code Playgroud)
正如我在迭代之前知道accountType的值,我不希望对列表中的每个条目进行此检查,因为如果一个实例的reportJDOList的大小为10000,它将导致大量检查.我们如何消除这件事?提前致谢 :)
我的问题很简单
在BigDecimal我想这样做:
public static void main (String [] args) {
System.out.println(new BigDecimal(1).divide(new BigDecimal(3));
}
Run Code Online (Sandbox Code Playgroud)
我希望结果是这样的:0.333333333333333333333333333333333.......
而不是0.3334或0.33。
我不明白为什么它不会产生超过11.
这是我的测试代码:
import java.util.Random;
public class randomNumberTest
{
public static void main(String[] args)
{
Random rn = new Random();
//tests random number generator (between 1(inc) and 10(excl))
for(int i =0; i < 100; i++)
{
int answer = rn.nextInt(10) + 1;
System.out.println(answer);
}
}
}
Run Code Online (Sandbox Code Playgroud) java ×7
bigdecimal ×1
idioms ×1
iteration ×1
java-8 ×1
javadoc ×1
next ×1
random ×1
refactoring ×1
scala ×1