Tag: instanceof

java优化nitpick:在投射之前调用instanceof进行检查是否更快投出一些东西并让它抛出exception?

在任何人说什么之前我只是出于好奇而问这个问题; 我不打算根据这个答案进行任何过早的优化。 我的问题是关于使用reflection和铸造的速度。 标准的说法是“反思很慢”。 我的问题是哪个部分确实很慢,为什么; 特别是在比较某事物是否是另一个实例的父母时。 我非常有信心只是将一个对象的类与另一个Class对象进行比较的速度与任何比较一样快,大概只是直接比较已经存储在Object状态中的单例对象; 但如果一个class级是另一个class级的父母呢? 我通常认为instanceof与普通类检查一样快,但今天我想到了它,似乎有些reflection必须在“幕后”发生才能工作。 我在网上查了一下,发现有人说instanceof很慢; 大概是因为比较物体的父母所需的reflection? 这导致了下一个问题,即仅仅是铸造。 如果我将某些东西作为对象投射,那么我不会得到ClassCastException 。 但是,如果将对象转换为自身的父对象,则不会发生这种情况。 基本上我正在做一个调用的instanceof ,或者当我在运行时进行演员时,我正在做这个效果的逻辑吗? 我从来没有听到过任何人暗示过投射物体之前可能会很慢。 不可否认,并非所有演员都是提供对象的父级,但很多演员都是父类。 然而,从来没有人暗示这可能会很慢。 那是哪个呢。 真的不是那么慢吗? instanceof和cast都是父类慢吗? 或者是否有某种原因可以比调用instanceof更快地完成演员表?

这种“instanceof”运算符的使用是否被认为是错误的设计?

在我的一个项目中,我有两个“数据传输对象”RecordType1和RecordType2,它们inheritance自RecordType的抽象类。 我希望两个RecordType对象在“process”方法中由同一个RecordProcessor类处理。 我的第一个想法是创建一个通用的流程方法,该方法委托给两个特定的流程方法,如下所示: public RecordType process(RecordType record){ if (record instanceof RecordType1) return process((RecordType1) record); else if (record instanceof RecordType2) return process((RecordType2) record); throw new IllegalArgumentException(record); } public RecordType1 process(RecordType1 record){ // Specific processing for Record Type 1 } public RecordType2 process(RecordType2 record){ // Specific processing for Record Type 2 } 我读过Scott Meyers在Effective C ++中写了以下内容: “任何时候你发现你自己编写的forms代码’如果对象是T1类型,那么做一些事情,但如果它是T2类型,那么做点其他事情,’打自己吧。” […]