Sightly var和吊索模型的getter的调用之间有什么区别?

问题描述:

是什么区别:Sightly var和吊索模型的getter的调用之间有什么区别?

<div data-sly-test.backgroundVideo="${hero.backgroundVideo}" > 
    Background video URL: 
     <a href="${backgroundVideo}.html" target="_blank"> 
      ${backgroundVideo} 
     </a> 
</div> 

和:

<div data-sly-test="${hero.backgroundVideo}" > 
    Background video URL: 
     <a href="${hero.backgroundVideo}.html" target="_blank"> 
      ${hero.backgroundVideo} 
     </a> 
</div> 

什么解决办法是更有效?使用视觉变量还是调用getter?

与其他任何类似域的编程语言一样,不会强制变量使用的任何要求。一个简单的比较就是将代码转换为等价的Java例程,并看到优化和性能影响(理论上)。

为了简单起见,我们让您的POJO类,如下:

class Hero { 

    public string getBackgroundVideo() { 
     //Some model logic 
    } 

} 

现在,考虑第一代码片段:

<div data-sly-test.backgroundVideo="${hero.backgroundVideo}" > 
    Background video URL: 
     <a href="${backgroundVideo}.html" target="_blank"> 
     ${backgroundVideo} 
     </a> 
</div> 

这只会执行getBackgroundVideo()一次,并将其存储在一个变量重用。

可替代地,用于第二代码段:

<div data-sly-test="${hero.backgroundVideo}" > 
    Background video URL: 
    <a href="${hero.backgroundVideo}.html" target="_blank"> 
     ${hero.backgroundVideo} 
    </a> 
</div> 

getBackgroundVideo()将被执行3次。

所以,在表面上,这可能看起来像一个1:在执行3差和看起来非常昂贵特别是如果有参与getBackgroundVideo()功能的复杂的代码的逻辑。这是真的,你应该通过试图缓存复杂函数的输出作为变量来避免这种方法。

但是,考虑一下这个问题的另一种看法,这也归结为你的POJO类的写法。所以,让我们重新审视你的Hero类:

class Hero { 
    private string backgroundVideo; 

    public void init() { 
     this.backgroundVide = "some value on business logic"; 
    } 

    public string getBackgroundVideo() { 
     return this.backgroundVideo; 
    } 

} 

如果您Hero POJO类如上落实,getBackgroundVideo()只是归结为一个简单的getter返回无需复杂计算的字符串值。当然,与本地HTL变量相比,函数调用的开销很小,但这可能很少,并且可能不明显。

总结真正的效果只能通过POJO实现来衡量,但HTL变量方法几乎总会给你缓存的好处。

+0

一个小小的增加:它不仅仅是多次执行一次吸气剂,还有更大的成本。在HTL中,被调用的方法使用反射来解析,并且(由于实现原因),这不能被优化得太多,所以需要在每次调用之前查找方法。 – Vlad

正如您所注意到的,区别在于${hero.backgroundVideo}的评估缓存在变量中。这对性能有一定的影响,因为它消除了需要进行一些思考以找到正确的方法来调用hero;如果被调用的方法很昂贵(JCR查找,远程调用...),影响可能会大得多。