标签: instanceof

检查消息类型时避免使用instanceof

我有以下情况,其中客户端类根据它接收的消息类型执行不同的行为.我想知道是否有更好的方法,因为我不喜欢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)

java polymorphism instanceof messages

9
推荐指数
2
解决办法
4795
查看次数

"instanceof"在Android Java代码中的影响

instanceof关键字是否会对Android平台产生相对较重的影响(更具体地说是运行Dalvik VM的手机?

performance android garbage-collection instanceof dalvik

9
推荐指数
1
解决办法
1万
查看次数

Javascript instanceof究竟是如何工作的?是慢节奏吗?

instanceof"巨型图书馆" 的公平表现如何?

它是否一个接一个地沿原型链传播,类似于此?:

//..
var _ = john.constructor;
while (true) {
    if (_ === Human) {
        return true;
    }
    _ = _.prototype.constructor
}
return false;
//..
Run Code Online (Sandbox Code Playgroud)

instanceof与在每个对象的属性中存储唯一的接口ID号相比,相对来说是不相容的.

javascript inheritance instanceof

9
推荐指数
3
解决办法
3489
查看次数

检查模拟对象的类类型

目前我正在测试一个获取对象的方法,并检查该对象是否是存储为实例变量的类的实例.到目前为止没问题.

但是在测试中我必须使用模拟,其中一个模拟是传递给该方法的对象.而现在,它变得棘手.让我们看看代码(我总结了这个测试中的代码):

    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)

好吧,这个测试实际上失败了.有谁知道为什么?有人知道如何通过在测试中使用模拟来解决这个问题吗?是否有其他方法可以将对象与特定类进行比较.

非常感谢你的帮助.

最好的祝福

赫拉尔

mocking instanceof mockito

9
推荐指数
2
解决办法
9868
查看次数

多个实例检查

是否有更短的方法来检查某个对象是否属于某组类的一部分?

使用instanceof使IF语句太长: if($obj instanceof \Class1 || $obj instanceof \Class2 || $obj instanceof \Class3....)

这不起作用: instance of \Class1 || \Class2 || \Class3

它假定Class2是常数..

php instanceof

9
推荐指数
3
解决办法
4701
查看次数

Java的奇怪行为的实例

任何人都可以解释为什么下面的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",并且不知道它是如何可能的.

java boolean instanceof

9
推荐指数
2
解决办法
170
查看次数

检查ArrayBufferView的实例?

背景

通过一些研究我发现,虽然ArrayBufferView最初没有公开(通过[NoInterfaceObject]),但由于我描述的用例,似乎应该有广泛的一致意见.

最初的协议是ArrayBufferViewDOMWindow命名空间上公开构造函数,该命名空间在Safari(并且仍然在6.1.1中)和Chrome中实现,但随后从Chrome提取,转而使用静态方法ArrayBuffer.isView().

与此同时,Mozilla(仍在)谈论实施 ArrayBuffer.isView().

简单来说:

  • Safari公开了ArrayBufferView构造函数

  • Chrome有 ArrayBuffer.isView()

  • Firefox什么都没有

  • IE - 我还没有接近......

所以,我的问题.检查对象是否是ArrayBufferView实例的最简洁方法是什么?

javascript instanceof typedarray arraybuffer

9
推荐指数
1
解决办法
4689
查看次数

缺少Class.isInstance()的GWT解决方法

我正在尝试在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(但我不知道在哪些情况下),因为它包含一条评论说"这个主体可能被替换为编译器".

还是有更好的方法来做到这一点?

java gwt class instanceof

9
推荐指数
2
解决办法
1918
查看次数

IFRAME中的instanceof HTMLElement不是Element或Object?

通过简单检查尝试确定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)

javascript iframe element instanceof

9
推荐指数
1
解决办法
2612
查看次数

如何使用不同的参数调用方法?

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)

java methods android instanceof android-context

9
推荐指数
1
解决办法
575
查看次数