是否更有效地投射两次或创建新实例

dcp*_*dcp 1 java casting

考虑这两段代码(您可以假设execeptionObj它是类型Object,但我们知道它是一个实例Throwable):

1)

logger.log(Level.ERROR, (Throwable) exceptionObj,
    ((Throwable) exceptionObj).getMessage());
Run Code Online (Sandbox Code Playgroud)

2)

Throwable t = new Throwable((Throwable)exceptionObj);
logger.log(Level.ERROR, t, t.getMessage());
Run Code Online (Sandbox Code Playgroud)

在我正在进行的项目的代码审查期间,一位评论者说第一种方式不如第二种方式有效,因为它涉及2次演员.我只是想知道你的想法.似乎创建一个新实例也会涉及一些开销.

Sea*_*wen 12

这两段代码做了不同的事情.在第二个中,您不再传递exceptionObj,而是"由exceptionObj引起的未指定的Throwable".我不认为这就是你想要的.

你的意思是第二行的第一行是:

Throwable t = (Throwable) exceptionObj;
Run Code Online (Sandbox Code Playgroud)

我猜,它的效率非常高,但不会让这个决定问题.哪个更易读是关键,我认为(修改过的)第二个更具可读性.

你真的需要托付给Throwable吗?肯定记录器已经使用了Throwable吗?

  • @dcp假设他/她并不是指"创建引用",那么审稿人肯定是错的.创建新对象肯定比强制转换慢.我们正在谈论微秒.真正的问题是正确性 - 您正在将无用的信息添加到日志中的异常链中. (2认同)

Bri*_*new 6

考虑到例外的成本而仅打印出内容,我建议这场辩论有点似是而非.