- 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/
简而言之:我想从可变参数模板参数中提取各种选项,但不仅通过标签而且通过那些参数的索引,这些参数是未知的 标签。我喜欢 boost 中的方法(例如 heap 或 lockfree 策略),但想让它与 S
我可以对单元格中的 excel IF 语句提供一些帮助吗? 它在做什么? 对“BaselineAmount”进行了哪些评估? =IF(BaselineAmount, (Variance/Baselin
我正在使用以下方法: public async Task Save(Foo foo,out int param) { ....... MySqlParameter prmparamID
我正在使用 CodeGear RAD Studio IDE。 为了使用命令行参数测试我的应用程序,我多次使用了“运行 -> 参数”菜单中的“参数”字段。 但是每次我给它提供一个新值时,它都无法从“下拉
我已经为信用卡类编写了一些代码,粘贴在下面。我有一个接受上述变量的构造函数,并且正在研究一些方法将这些变量格式化为字符串,以便最终输出将类似于 号码:1234 5678 9012 3456 截止日期:
MySql IN 参数 - 在存储过程中使用时,VarChar IN 参数 val 是否需要单引号? 我已经像平常一样创建了经典 ASP 代码,但我没有更新该列。 我需要引用 VarChar 参数吗?
给出了下面的开始,但似乎不知道如何完成它。本质上,如果我调用 myTest([one, Two, Three], 2); 它应该返回元素 third。必须使用for循环来找到我的解决方案。 funct
将 1113355579999 作为参数传递时,该值在函数内部变为 959050335。 调用(main.c): printf("%d\n", FindCommonDigit(111335557999
这个问题在这里已经有了答案: Is Java "pass-by-reference" or "pass-by-value"? (92 个回答) 关闭9年前。 public class StackOve
我真的很困惑,当像 1 == scanf("%lg", &entry) 交换为 scanf("%lg", &entry) == 1 没有区别。我的实验书上说的是前者,而我觉得后者是可以理解的。 1 =
我正在尝试使用调用 SetupDiGetDeviceRegistryProperty 的函数使用德尔福 7。该调用来自示例函数 SetupEnumAvailableComPorts .它看起来像这样:
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
rails 新手。按照多态关联的教程,我遇到了这个以在create 和destroy 中设置@client。 @client = Client.find(params[:client_id] || p
通过将 VM 参数设置为 -Xmx1024m,我能够通过 Eclipse 运行 Java 程序-Xms256M。现在我想通过 Windows 中的 .bat 文件运行相同的 Java 程序 (jar)
我有一个 Delphi DLL,它在被 Delphi 应用程序调用时工作并导出声明为的方法: Procedure ProduceOutput(request,inputs:widestring; va
浏览完文档和示例后,我还没有弄清楚 schema.yaml 文件中的参数到底用在哪里。 在此处使用 AWS 代码示例:https://github.com/aws-samples/aws-proton
程序参数: procedure get_user_profile ( i_attuid in ras_user.attuid%type, i_data_group in data_g
我有一个字符串作为参数传递给我的存储过程。 dim AgentString as String = " 'test1', 'test2', 'test3' " 我想在 IN 中使用该参数声明。 AND
这个问题已经有答案了: When should I use "this" in a class? (17 个回答) 已关闭 6 年前。 我运行了一些java代码,我看到了一些我不太明白的东西。为什么下
我输入 scroll(0,10,200,10);但是当它运行时,它会传递字符串“xxpos”或“yypos”,我确实在没有撇号的情况下尝试过,但它就是行不通。 scroll = function(xp
我是一名优秀的程序员,十分优秀!