我有以下情况,其中客户端类根据它接收的消息类型执行不同的行为.我想知道是否有更好的方法,因为我不喜欢instanceof和if语句.
我想做的一件事是将方法拉出客户端类并将它们放入消息中.我会在IMessage接口中放入一个类似process()的方法,然后将消息特定的行为放在每个具体的消息类型中.这会使客户端变得简单,因为它只调用message.process()而不是检查类型.但是,唯一的问题是条件中包含的行为与对Client类中包含的数据的操作有关.因此,如果我在具体的消息类中实现了一个进程方法,我将不得不将它传递给客户端,我不知道这是否真的有意义.
public class Client {
messageReceived(IMessage message) {
if(message instanceof concreteMessageA) {
concreteMessageA msg = (concreteMessageA)message;
//do concreteMessageA operations
}
}
if (message instanceof concreteMessageB) {
concreteMessageb msg = (concreteMessageB)message;
//do concreteMessageB operations
}
}
Run Code Online (Sandbox Code Playgroud) instanceof关键字是否会对Android平台产生相对较重的影响(更具体地说是运行Dalvik VM的手机?
instanceof"巨型图书馆" 的公平表现如何?
它是否一个接一个地沿原型链传播,类似于此?:
//..
var _ = john.constructor;
while (true) {
if (_ === Human) {
return true;
}
_ = _.prototype.constructor
}
return false;
//..
Run Code Online (Sandbox Code Playgroud)
instanceof与在每个对象的属性中存储唯一的接口ID号相比,相对来说是不相容的.
目前我正在测试一个获取对象的方法,并检查该对象是否是存储为实例变量的类的实例.到目前为止没问题.
但是在测试中我必须使用模拟,其中一个模拟是传递给该方法的对象.而现在,它变得棘手.让我们看看代码(我总结了这个测试中的代码):
Class<AdapterEvent> clazz = AdapterEvent.class;
AdapterEvent adapterEvent = Mockito.mock(AdapterEvent.class);
Assert.assertTrue(adapterEvent.getClass().equals(clazz));
Assert.assertTrue(adapterEvent.getClass().isAssignableFrom(clazz));
Run Code Online (Sandbox Code Playgroud)
好吧,这个测试实际上失败了.有谁知道为什么?有人知道如何通过在测试中使用模拟来解决这个问题吗?是否有其他方法可以将对象与特定类进行比较.
非常感谢你的帮助.
最好的祝福
赫拉尔
是否有更短的方法来检查某个对象是否属于某组类的一部分?
使用instanceof使IF语句太长:
if($obj instanceof \Class1 || $obj instanceof \Class2 || $obj instanceof \Class3....)
这不起作用:
instance of \Class1 || \Class2 || \Class3
它假定Class2是常数..
任何人都可以解释为什么下面的if语句评估为false?
public void addShapeToWhiteboard(PolyLine shape)
{
Window.alert("2");
if(shape instanceof PolyLine)
{
Window.alert("3");
this.whiteboard.add((PolyLine)shape);
Window.alert("3.5");
}
this.whiteboard.draw();
Window.alert("4");
}
Run Code Online (Sandbox Code Playgroud)
它接收一个"PolyLine"对象,但是instanceof返回false,因为我得到一个警告"2",然后是一个警告"4",并且不知道它是如何可能的.
通过一些研究我发现,虽然ArrayBufferView最初没有公开(通过[NoInterfaceObject]),但由于我描述的用例,似乎应该有广泛的一致意见.
最初的协议是ArrayBufferView在DOMWindow命名空间上公开构造函数,该命名空间在Safari(并且仍然在6.1.1中)和Chrome中实现,但随后从Chrome中提取,转而使用静态方法ArrayBuffer.isView().
与此同时,Mozilla(仍在)谈论实施 ArrayBuffer.isView().
Safari公开了ArrayBufferView构造函数
Chrome有 ArrayBuffer.isView()
Firefox什么都没有
IE - 我还没有接近......
所以,我的问题.检查对象是否是ArrayBufferView实例的最简洁方法是什么?
我正在尝试在GWT中编写一个作业调度系统,它维护一系列例外(Class<? extends Exception>[] exceptions),可以通过重试作业来解决.为此,如果调度程序捕获异常,我需要查看此异常是否与数组中的某个类匹配.所以,我希望有这样的功能:
boolean offerRetry(Exception exception) {
for (Class<? extends Exception> e: exceptions)
if (e.isInstance(exception)) return true;
return false;
}
Run Code Online (Sandbox Code Playgroud)
不幸的Class.isInstance(...)是GWT没有.
有一个很好的解决方案吗?我目前最好的猜测是这样的:
public static boolean isInstance(Class<?> clazz, Object o) {
if ((clazz==null) || (o==null)) return false;
if (clazz.isInterface()) throw new UnsupportedOperationException();
Class<?> oClazz = o.getClass();
while (oClazz!=null) {
if (oClazz.equals(clazz)) return true;
oClazz = oClazz.getSuperclass();
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种方法不支持对接口进行测试,我也不知道如何解决这个问题,因为Class.getInterfaces()它也是不可用的.但是这种方法Class.isInstance在所有其他情况下至少与Java的工作方式相同,不包括接口吗?具体来说,如果我查看GWT的Class.java源代码,该getSuperclass()方法包含一个检查isClassMetadataEnabled(),可能会返回false(但我不知道在哪些情况下),因为它包含一条评论说"这个主体可能被替换为编译器".
还是有更好的方法来做到这一点?
通过简单检查尝试确定DOM元素
isElement = SomeThing instanceof Element
Run Code Online (Sandbox Code Playgroud)
适用于主文档,但不适用于iframe中的(所有?)节点.
示例输出(谷歌浏览器):(主要文档中的mdiv是DIV,iframe中的id是DIV)
OMGWTF
ok: mdiv instanceof Element ... true ... [object HTMLDivElement]
ok: mdiv instanceof Object ... true ... [object HTMLDivElement]
ko: idiv instanceof Element ... false ... [object HTMLDivElement]
KO : idiv instanceof Object ... false ... [object HTMLDivElement]
Run Code Online (Sandbox Code Playgroud)
主文档和iframe文档有不同的javascript实现???
请解释我的错误.
示例:(http://www.sbmintegral.sk/GITHUB/OMGWTF/obalka.xhtml)
代码:obalka.xhtml(主要文件)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Obalka</title>
</head>
<body>
<div id="auto_filled_commands_container">
MAIN div id="auto_filled_commands_container"<br/>
<iframe id="auto_filled_commands_iframe" src='dopis.xhtml' style="width:98%;height:98%;"/>
</div>
<div>
<textarea id="OMGWTF" style="width:700px;height:200px">
mdiv = …Run Code Online (Sandbox Code Playgroud) 我String从数据库中获取3个值,然后我将其转换为Long然后我正在计算差异,然后将此计算Long值作为参数放入方法中.我正在使用FastAdapter.
这filterRequests(List <Long> l)是一种MainActivity基于long来过滤请求/内容的逻辑的方法l.
整个适配器:
public class GRModelClass extends AbstractItem<GRModelClass, GRClass.ViewHolder>{
private static final ViewHolderFactory<? extends ViewHolder> FACTORY = new ItemFactory();
String postedBy, postedTime, currentLat, currentLng, utcFormatDateTime, userEmail, userID;
String startDateTimeInEpoch, endDateTimeInEpoch;
DatabaseReference primaryDBKey;
long ms;
String itemID;
public GRModelClass(){}
public GRModelClass(String postedBy, String postedTime, String currentLat, String currentLng, String utcFormatDateTime, String userEmail, String userID, String startDateTimeInEpoch, String endDateTimeInEpoch, DatabaseReference primaryDBKey) {
this.postedBy = " " …Run Code Online (Sandbox Code Playgroud) instanceof ×10
java ×4
javascript ×3
android ×2
arraybuffer ×1
boolean ×1
class ×1
dalvik ×1
element ×1
gwt ×1
iframe ×1
inheritance ×1
messages ×1
methods ×1
mocking ×1
mockito ×1
performance ×1
php ×1
polymorphism ×1
typedarray ×1