高度重复的代码通常是不好的事情,并且有些设计模式可以帮助最大程度地减少这种情况。但是,由于语言本身的限制,有时这是不可避免的。从以下示例java.util.Arrays
:
/**
* Assigns the specified long value to each element of the specified
* range of the specified array of longs. The range to be filled
* extends from index <tt>fromIndex</tt>, inclusive, to index
* <tt>toIndex</tt>, exclusive. (If <tt>fromIndex==toIndex</tt>, the
* range to be filled is empty.)
*
* @param a the array to be filled
* @param fromIndex the index of the first element (inclusive) to be
* filled with the specified value
* @param toIndex the index of the last element (exclusive) to be
* filled with the specified value
* @param val the value to be stored in all elements of the array
* @throws IllegalArgumentException if <tt>fromIndex > toIndex</tt>
* @throws ArrayIndexOutOfBoundsException if <tt>fromIndex < 0</tt> or
* <tt>toIndex > a.length</tt>
*/
public static void fill(long[] a, int fromIndex, int toIndex, long val) {
rangeCheck(a.length, fromIndex, toIndex);
for (int i=fromIndex; i<toIndex; i++)
a[i] = val;
}
上面的片段出现在源代码的8倍,具有非常小的变化中的文档/方法签名但 完全相同的方法体
,一个用于每个根数组类型int[]
,short[]
,char[]
,byte[]
,boolean[]
,double[]
,float[]
,和Object[]
。
我相信,除非有人诉诸反思(本身是完全不同的主题),否则这种重复是不可避免的。我知道作为实用程序类,如此大量的重复Java代码非常不典型,但是即使采用最佳实践,
重复也确实会发生 !重构并不总是可行的,因为它并非总是可行的(显而易见的情况是文档中有重复项)。
显然,维护此源代码是一场噩梦。无论进行多少次重复,文档中的轻微错字或实现中的小错误都会成倍增加。实际上,最好的例子恰好涉及此确切的类:
Google Research博客-额外,额外-全部阅读:几乎所有二进制搜索和合并排序均被破坏(软件工程师Joshua
Bloch)
该错误是一个令人惊讶的微妙错误,发生在许多人认为只是一种简单明了的算法中。
// int mid =(low + high) / 2; // the bug
int mid = (low + high) >>> 1; // the fix
上一行 在源代码中出现11次 !
所以我的问题是:
评论要求提供另一个示例,因此我从Google
Collections中提取了这个示例:com.google.common.base。谓词AndPredicate
为276-310
行()和312-346行(OrPredicate
)。
这两个类的来源相同,除了:
AndPredicate
vs OrPredicate
(每堂课出现5次)"And("
vs Or("
(在相应toString()
方法中)#and
vs #or
(在@see
Javadoc注释中)true
vs false
(输入apply
;!
可以从表达式中重写)-1 /* all bits on */
VS 0 /* all bits off */
中hashCode()
&=
VS |=
中hashCode()
对于绝对需要性能的人,装箱和拆箱以及通用的收藏品不容错过。
在性能计算中会发生相同的问题,您需要使用相同的复合体才能进行浮点运算和双精度运算(例如,Goldberd的 _“
每位计算机科学家应该了解的浮点数
”一_文中介绍的一些方法)。
还有,为什么一个原因特罗韦的TIntIntHashMap
运行围绕Java界真实HashMap<Integer,Integer>
有类似的数据量工作时。
现在Trove集合的源代码是如何编写的?
通过使用源代码工具当然是:)
有几个Java性能更高的库(比默认Java库要高得多),它们使用代码生成器来创建重复的源代码。
我们都知道“源代码工具”是邪恶的,而代码生成却是废话,但这仍然是真正知道自己在做什么的人(即那种像Trove这样的人):)
值得的是,我们生成包含重大警告的源代码,例如:
/*
* This .java source file has been auto-generated from the template xxxxx
*
* DO NOT MODIFY THIS FILE FOR IT SHALL GET OVERWRITTEN
*
*/
假设我有理由要求通过多个值类型快速查找类实例,为了便于解释,我将以游戏服务器为例。 假设服务器使用静态标识号处理用户。这个数字用于与特定玩家交流和互动(即:私聊、交易请求、战斗、公会邀请等)。 这需要经常使用玩家的识别号来查找玩家,根据我目前的经验,最好的方法是:(如果我错了,请纠正我。) 然而,在处理网络时,很多时候我还需要将播放器与网络会话关联,或者一些人可能更熟悉的“套接字”。看起来是这样的
我有一个Spring数据jpa应用程序和一个库。该库包含一个类,假设 Car.java 在我的应用程序中,我需要存储这个对象,并希望使用rest存储库。为此,我需要对该类进行注释: 有没有一种方法可以在不重复代码和/或不复制的情况下做到这一点?
就像在主题中一样 - 如何获得宽度和高度。这个问题指的是一个示例情况,其中您希望以的形式为创建背景,其大小取决于的大小。
我正在学习React.js。我熟悉下面的代码 但我得到了以下代码作为问题的解决方案。 我不能理解上面的代码。谁能帮我理解一下? 这里的是什么? 我知道播音员。为什么我在这里传递它和这里
本文向大家介绍java编写的文件管理器代码分享,包括了java编写的文件管理器代码分享的使用技巧和注意事项,需要的朋友参考一下 比较适合新手。逻辑上仍然有点问题。可以用于学习java文件操作 下载地址:http://yun.baidu.com/share/link?shareid=4184742416&uk=1312160419 下面是主要的JAVA文件操作代码 FileHelp.java 以上所
我正在尝试我的Matplotlib图表的一些功能,我想在图表的不同部分创建一系列小正方形。 以下是文档说明的内容:下面的示例演示了使用数组在一个命令中绘制具有不同格式样式的多条线。 我的问题是:我不需要一行正方形,我只需要在X,Y坐标的某个位置加上一行,但我遇到的问题是找到一种方法使它变小,下面是我尝试的: 我试图将设置为不同的值,但没有任何变化。文档在这方面有点模糊,有人能告诉我如何设置正方形的