- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题详细信息。我需要创建一个框架来执行各种检查,例如:- 日期 A 是否位于日期 B 和 C 之间?- 整数 A 是否大于整数 B 且小于整数 C?ETC。到目前为止,我正在考虑两种可能的实现,详细信息如下。
Impl1 - 根据检查类型使用单个类执行检查。
import java.sql.Time;
import java.util.Date;
public class SearchManager {
public final static int SEARCH_TYPE_DATE = 0;
public final static int SEARCH_TYPE_INT = 1;
public final static int SEARCH_TYPE_STRING = 2;
public final static int SEARCH_TYPE_TIME = 3;
private final int searchType;
public SearchManager(int searchType) {
this.searchType = searchType;
}
public final boolean doCompare(Object minValue, Object maxValue, Object toBeCompared) {
switch (this.searchType) {
case SEARCH_TYPE_DATE: {
return compareDates((Date) minValue, (Date) maxValue, (Date) toBeCompared);
}
case SEARCH_TYPE_INT: {
return compareIntegers((Integer) minValue, (Integer) maxValue, (Integer) toBeCompared);
}
case SEARCH_TYPE_STRING: {
return compareStrings(String.valueOf(minValue), String.valueOf(maxValue), String.valueOf(toBeCompared));
}
case SEARCH_TYPE_TIME: {
return compareTimes((Time) minValue, (Time) maxValue, (Time) toBeCompared);
}
default:
return false;
}
}
private boolean compareDates(Date min, Date max, Date toBeCompared) {
boolean result = false;
// actual comparison
return result;
}
private boolean compareIntegers(Integer min, Integer max, Integer toBeCompared) {
boolean result = false;
// actual comparison
return result;
}
private boolean compareStrings(String min, String max, String toBeCompared) {
boolean result = false;
// actual comparison
return result;
}
private boolean compareTimes(Time min, Time max, Time toBeComparedDate) {
boolean result = false;
// actual comparison
return result;
}
}
Impl2 - 使用抽象类或接口(interface),并为每种搜索类型实现比较方法。
public abstract class AbstractSearch {
public final static int SEARCH_TYPE_DATE = 0;
public final static int SEARCH_TYPE_INT = 1;
public final static int SEARCH_TYPE_STRING = 2;
public final static int SEARCH_TYPE_TIME = 3;
public AbstractSearch() {
super(); //just for fun
}
protected abstract boolean doCompare(Object minValue, Object maxValue, Object toBeComparedValue);
}
现在,在这个示例中,正如您可以想象的那样,对于 X 个不同的搜索类型,将创建 AbstractSearch
的 X 个实现。
想象一下,除了方法 doCompare(..)
之外,第二个实现中的类 AbstractSearch
还需要执行其他任务,这就是为什么需要一个接口(interface)不是我这个解决方案的第一个候选人,并且写了类似的东西
public abstract class AbstractSearch implements Searcheable
对我帮助不大,因为 AbstractSearch
或 SearchManager
将处理所有比较,并且,如果需要新的比较类型,则需要额外的类型/子类将为 Impl1 或 Impl2 中的相应父类(super class)声明实现。
我的问题是哪个实现速度更快?这非常重要,因为比较过程将在包含数千个元素的循环中调用。感谢您阅读/回答我的问题。
EDIT1:另外,请记住,对于第二个示例,minValue 和 maxValue 将从扩展 AbstractSearch
的类中提取,或者从扩展的类中提取SearchManager
,与第一个示例相同。这些实现实际上是图形组件,允许用户输入最小值和最大值,然后,这些值将在循环中与表中显示的对象的某些 bean 属性进行比较。
EDIT2:我正在使用虚拟实现进行一些基准测试(我只想比较方法调用时间与切换执行时间)。结果令人惊讶:
有了这些结果,就可以安全地假设使用继承比使用 switch 快得多(甚至更糟糕的 if-else 测试)?
最佳答案
如果您想让此代码尽可能快,还可以尝试使用如下重载方法:
public final static boolean doCompare(Date min, Date max, Date toCompare) {
// ...
}
public final static boolean doCompare(int min, int max, int toCompare) {
// ...
}
// ...and so on
在编译时,编译器将根据您传递的类型生成对适当方法的直接调用。 (如果您传递的对象引用可能指向 4 种类型中任何一种的实例,则这将不起作用。)
如果您要比较的值是 int
,则将它们传递给采用 Object
参数的方法将需要装箱和拆箱,这会增加开销。
如果性能确实很重要,我建议您使用静态
方法,因为它们在许多 Java 实现中要快一些。
此外,您可以通过使用自己的内联代码进行比较来获得更多的性能,而不是使用 compareTo
。
编辑:您在编辑后的问题中说 min
和 max
实际上将由 SearchManager< 的子类传入
。在这种情况下,我将创建 SearchManager
abstract
,并将 doCompare
的不同实现放入 SearchManager
的每个子类中。我所说的关于静态
方法在这种情况下不起作用。
关于java - 速度分析器 - 基于参数类型的抽象方法或开关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9438789/
我想要 angularJs 中的一个按钮,当我按下它时会调用一个函数,当我再次按下它时它会执行另一个功能,比如 ON-OFF 开关。 我有这个: 我会在单击一次时调用另一个函数。 最佳答案 您可
我有一个相当大的 switch 语句(或同样大的 if 语句),我想在 Doxygen 中记录一些方法,可能是调用者图,或者可能是某种流程图格式。 我怎样才能做到这一点? 谢谢 ! 最佳答案 通常 d
public int[] Level1Items(int floor) { switch (floor) { case 0: case 1:
我有一些R代码看起来基本上是这样的: compute.quantiles <- function(mu, type) { ## 'mu' and 'type' are vectors of the
嗨,我正在尝试处理 ajax json 响应 这是我的代码 success: function (j) { switch(true) { case (j.cho
我在尝试在 Javascript 中进行切换时遇到问题,当切换激活时,根据情况,程序将显示许多新按钮,您可以单击这些按钮并播放声音。 这是我的 HTML 和 Javascript,带有第一组按钮: f
static double rSetzen(){ double r; System.out.println("Sind sie männlich oder weiblich?");
作为我用 Haskell 编写的迷你解释器的一部分,我正在编写一个执行以下操作的函数:如果是 eval (App e1 e2) ,我想递归评估 e1 ( eval e1 ),将结果设置为 v1 .然后
对于C语言,我知道我很接近,但是对于输入的任何字符,打印输出都是“辅音”。我的 switch case 语句有什么问题。我需要 if 语句吗? #include #include int main
我有以下方法,它以类的类型作为参数: public void test(Type proType){ } 我目前有一个很大的 if else 看起来像: if(proType == typeof(Cl
我正在编写带有开关功能的代码。我希望我的默认代码打印“错误”并使程序停止运行。我应该在默认值末尾添加 return 1; 吗? 如果是这样,这样对吗? switch (course3) { c
VB.NET,但 C# 也可以。 我有一个 MustInherit 基类和 170 个基于它的继承类。为什么这么多?因为每个继承的类在 Sub New() 中做了不同的事情。继承的类型不添加任何新属性
在我的开关中,我希望案例从 0 变为 (number_of_cases-1),而无需自己编写数字。因此,如果我在中间删除一个 case block ,则以下 case 将重新编号(减 1),以便再次从
我想在我的应用中使用精确的 Material 开关。正是谷歌设计指南中的那些。 https://www.google.com/design/spec/components/selection-cont
有没有比我使用的更好的方法来实现切换/开关。它有效,但对我来说似乎很笨拙。 var foo = true; $(document).on("click","$element",function(){
我尝试将全局变量与 switch 语句一起使用,但变量的值没有改变。也许是范围问题? 我需要一个 switch 语句来逐一循环遍历每种情况,但每次我在控制台中查看时,“i”变量都会重置为 1。 为什么
我最近在一个网站上工作,在本地主机上一切正常,但是当我将它移到服务器上时,更改 div 函数开始加载怪异,我不知道为什么。当您循环浏览投资组合按钮和联系人按钮时,该错误会更加明显。 该网站仅针对 Fi
我一直在开发一个使用 switch() 函数的项目,如下所示: switch (selectedMenu) { case 1: switch (selectedIndex) {
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Variable declaration in c# switch statement 我一直想知道: 当我
我有一个奇怪的问题,我似乎无法解决。我有相当复杂的代码,但我已经简化了它,问题仍然存在。 请参阅以下内容: 'correct'); switch (true) { case empty($m
我是一名优秀的程序员,十分优秀!