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变量方法几乎总会给你缓存的好处。
答
正如您所注意到的,区别在于${hero.backgroundVideo}
的评估缓存在变量中。这对性能有一定的影响,因为它消除了需要进行一些思考以找到正确的方法来调用hero
;如果被调用的方法很昂贵(JCR查找,远程调用...),影响可能会大得多。
一个小小的增加:它不仅仅是多次执行一次吸气剂,还有更大的成本。在HTL中,被调用的方法使用反射来解析,并且(由于实现原因),这不能被优化得太多,所以需要在每次调用之前查找方法。 – Vlad