我们什么时候应该使用 scala.util.DynamicVariable?
当我阅读scalatra的源代码时,我发现有一些代码,例如:
protected val _response = new DynamicVariable[HttpServletResponse](null)
protected val _request = new DynamicVariable[HttpServletRequest](null)
有一个有趣的类,名为DynamicVariable
。我看过这个类的文档,但我不知道什么时候以及为什么我们应该使用它?它有一个通常使用的withValue()
。
如果我们不使用它,那么我们应该使用什么代码来解决它解决的问题?
(我是scala新手,如果你能提供一些代码,那就太好了)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
DynamicVariable
是贷款和动态范围模式的实现。DynamicVariable
的用例与 Java 中的ThreadLocal
非常相似(事实上,DynamicVariable
使用InheritableThreadLocal
> 在幕后) - 当您需要在封闭范围内进行计算时使用它,其中每个线程都有自己的变量值副本:假设
DynamicVariable
使用可继承的ThreadLocal
,变量的值被传递给上下文中生成的线程:DynamicVariable
(和ThreadLocal
)在 Scalatra 中使用,其原因与在许多应用程序中使用的原因相同其他框架(Lift、Spring、Struts 等)- 这是一种存储和传递上下文(线程)特定信息的非侵入式方式。制作
HttpServletResponse
和HttpServletRequest
动态变量(因此绑定到处理请求的特定线程)只是在代码中的任何位置获取它们的最简单方法(而不是通过方法参数或其他明确的方式)。DynamicVariable
is an implementation of the loan and dynamic scope patterns. Use-case ofDynamicVariable
is pretty much similar toThreadLocal
in Java (as a matter of fact,DynamicVariable
usesInheritableThreadLocal
behind the scenes) - it's used, when you need to do a computation within an enclosed scope, where every thread has it's own copy of the variable's value:Given that
DynamicVariable
uses an inheritableThreadLocal
, value of the variable is passed to the threads spawned in the context:DynamicVariable
(andThreadLocal
) is used in Scalatra for the same reason it's used in many other frameworks (Lift, Spring, Struts, etc.) - it's a non-intrusive way to store and pass around context(thread)-specific information.Making
HttpServletResponse
andHttpServletRequest
dynamic variables (and, thus, binding to a specific thread that processes request) is just the easiest way to obtain them anywhere in the code (not passing through method arguments or anyhow else explicitly).Vasil 很好地回答了这个问题,但我将添加一个额外的简单示例,可能会进一步帮助理解。
假设我们必须使用一些使用 println() 的代码来写入所有 stdout。我们希望将此输出发送到日志文件,但我们无权访问源代码。
println()
使用Console.println()
Console.println()
(幸运的是)是 基于默认的DynamicVariable[PrintStream]
java.lang.System.out
Console
定义withOut
只转发到动态变量的withValue
我们可以用它来简单地修复我们的问题问题:
This is well answered by Vasil, but I'll add an additional simple example that might further help understanding.
Suppose we must use some code that uses println() to write all over stdout. We want this output to go to a log file, but we don't have access to the source.
println()
usesConsole.println()
Console.println()
(fortunately) is based on aDynamicVariable[PrintStream]
that defaults tojava.lang.System.out
Console
defineswithOut
that just forwards to the dynamic variable'swithValue
We can use this to simply fix our issue:
这是一个最小的片段:
输出将是:
This is a minimal snippet:
The output will be: