问题标签 [lazy-initialization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
5870 浏览

performance - Scala 惰性值:性能损失?线程安全?

可能重复:
lazy val 的(隐藏)成本是多少?(斯卡拉)

Scala 允许定义惰性值

wheresomeCostlyInitialization仅在第一次使用时评估maybeUnusedValue. 也就是说,它最多被评估一次,如果maybeUnusedValue从不使用,它也永远不会被评估。

这是线程安全的吗?这对性能有何影响?如果这是线程安全的,它必须使用某种同步/以某种方式使用 Java volatile。不幸的是,Scala 语言规范对此只字未提。

0 投票
5 回答
1228 浏览

java - Java中的可配置枚举

我正在寻找一种更好的模式来实现这样的事情:

问题是访问enum原因的副作用。说Bar打开一个数据库连接等。所以即使我只是需要VAL2,我也必须付出代价来设置VAL1

OTOH, 的值barenum. 它就像一个静态属性,但enum没有延迟初始化。我可以制作Foo.getBar()抽象类并使用匿名类,但是我每次都必须支付设置费用。

有没有一种便宜的方法来为enums 的属性添加惰性初始化?

[编辑]为了明确这一点:

  1. getBar()被称为数百万次。它一定是快速致盲。

  2. 我们在这里谈论单例(就像enum它本身一样)。只能创建一个实例。

    对于附加点,单元测试应该能够覆盖此行为。

  3. 实例必须延迟创建。

我们尝试在 Spring 中将值注册为 bean 的一种解决方案:

这允许我们在运行时指定值并在测试中覆盖它们。不幸的是,这意味着我们必须以某种方式ApplicationContext注入。enum所以我们需要一个全局变量。畏缩

更糟糕的是:查找价值getBar()太慢了。我们可以synchronize getBar()并使用if(bar!= null)bar=context.get(name()+".bar");来解决这个问题。

但是有没有一种方法可以像使用这些enum值本身一样安全和快速?

0 投票
3 回答
992 浏览

php - 如何仅在 PHP 中需要时才加载变量

我有一个具有多个公共属性的类,其对象正在系统的不同部分使用。问题是我只需要在使用类的对象的每个地方加载其中的一些公共属性,因为每次加载整个属性列表都需要很长时间。

有什么方法可以使用__autoload或类似的函数来调用在调用时加载不同变量的函数?

例如

0 投票
3 回答
1174 浏览

c# - C#是否应该有一个惰性关键字

C# 是否应该有一个惰性关键字来使惰性初始化更容易?

例如

代替

0 投票
1 回答
2009 浏览

c# - 使用数据时带有 Spring LazyInitializationException 的 C# NHibernate

我正在开发一个 NHibernate 项目,并且之前在加载集合时遇到了麻烦(http://stackoverflow.com/questions/4213506/c-hibernate-criteria-loading-collection),现在我在使用数据时遇到了问题。

我将 C# 与 NHibernate 和 Spring.Net 框架结合使用,在加载例如“ordercredit”然后访问 ordercredit 的对象后,我得到了一个 LazyInitializationException。

我使用此代码获取 OrderCredit:

我用于加载的代码是使用 DAO 实现完成的:

当我在本地机器上运行它时,一切正常,我实际上打算加载那些“ordercredits”的列表,但这也出错了,所以我先尝试了一个更简单的步骤。

'OrderCredit' 中的对象定义为 [OneToMany]。

当我把它放在测试服务器上,并尝试访问加载的 OrderCredit 的“OrderObject”对象时,我得到了错误:

NHibernate.LazyInitializationException: Initializing[.OrderObject#5496522] - 无法初始化代理 - 没有会话。

失败的代码:

有效的代码:

对于属于 OrderCredit 的任何对象都会发生这种情况,但我能够访问 OrderCredit 的属性字段(例如 OrderCredit.Id)。

此外,当我在将数据返回给调用该方法的原始函数之前访问任何对象时,它确实会缓存信息左右,因为那时我可以访问它。

我已经阅读了很多关于这个问题的信息,比如关闭 Lazy,但这对我也不起作用(或者我在错误的地方做了那个)。

最让我沮丧的是,它实际上在我的本地机器上运行,而不是在测试服务器上运行。我可能做错了什么?

非常感谢任何帮助。

第一次更新:

我现在使用的是 GenericDao,使用加载 1 个 ordercredit 的默认方法。我使用以下代码按 Id 加载 1 个 ordercredit。

GenericDAO 中的代码如下,但它不会结束或中断会话,这意味着我能够访问附加到 ordercredit 的对象:

这与我在此问题前面包含的函数中的代码几乎相同。

我现在真的很困惑,因为我不知道结束会话的可能是什么。我现在将使用它,因为它可以工作,但我想稍后更改它,所以我可以使用我的函数来调用整个集合并通过 for each 循环访问它们。

目前,我使用我的“getOrderCredits”函数来获取 OrderCredit 对象的列表,在 foreach 中,我获取 Id,并使用 GenericDao.Load 获取实际项目,并且可以访问对象等。当然,这不是它应该和需要的方式。

如果我能解决这个问题,我会感到惊讶。

0 投票
2 回答
3662 浏览

c# - 初始化惰性实例时将参数传递给构造函数

据我所知,如果声明了一个变量,那么当我们使用该属性Lazy时就会调用它的构造函数。Value

我需要将一些参数传递给这个Lazy实例,但找不到正确的语法。这不是我的设计,我使用的是 MEF ExportFactory,它返回Lazy了我的零件实例。我的零件有构造函数,我需要用一些参数调用这些构造函数。

0 投票
2 回答
8231 浏览

java - Spring 3.0 延迟初始化不支持 DefaultMessageListenerContainer?

我已经为 JMS 设置了一个 spring 配置。一切正常,除了我似乎无法让它延迟加载(注意下面代码中的 default-lazy-init true )。如果我从下面的配置中注释掉 jmsContainer(DMLC),延迟加载将按预期工作。否则,它将实例化 DMLC,进而创建队列和连接工厂。

我错过了什么?

jmsContext.xml:

而我用来驱动它的测试,DummyTest.java:

当 jmsContainer 被注释掉时,上面的测试就通过了。否则,我得到这个:

“connectionFactory”bean 被实例化为“jmsContainer”的依赖项,但它失败了。注释掉“jmsContainer”后,“connectionFactory”不会被实例化。

jms 代码工作正常,但我故意重命名了我的 JNDI 名称,以便我可以看到事情何时开始。

0 投票
1 回答
1365 浏览

.net - 使用 WebSessionContext/CurrentSessionContext 延迟初始化 ISession

我正在使用 NHibernate 3 开始一个新项目,并且正在尝试将 CurrentSessionContext API 与 WebSessionContext 一起使用来管理我的 ISession 对象。

在以前的项目中,我总是自己管理,所以每当我需要一个 ISession 对象时,我都会创建它并存储在 HttpContext.Items 集合中。非常简单,但使用本机解决方案 (CurrentSessionContext) 似乎是这个新项目的最佳选择。

当我管理对象时,我能够对其进行延迟初始化,这意味着我只会在需要时打开一个会话,而不是在每个请求中打开它,因为我可能不需要它,并且打开它会浪费资源/时间时间。

有没有一种简单的方法可以使用 CurrentSessionContext API 做到这一点?

这是我在负责此操作的 HttpModule 中使用的代码:


编辑

Diego 几乎做到了,但我对此进行了更多思考,我记得我自己实现该控制的主要原因:事务。

我是洋葱架构师,所以我的域对象(知道何时开始事务的对象)无法访问基础设施,因此他们无法开始事务。

为了解决这个问题,我使用延迟初始化,并且总是在打开 Session 时启动事务。当请求结束并且没有捕获到异常时,就会发生提交。除此之外,Ayende 的建议是始终使用事务,即使在查询时也是如此。有什么想法吗?

0 投票
3 回答
9295 浏览

c# - 使用属性进行延迟初始化的方法

我目前正在更改一个广泛使用的类,以将尽可能多的昂贵初始化从类构造函数转移到惰性初始化属性中。下面是一个示例(在 c# 中):

前:

后:

在我正在更改的类中还有相当多的这些属性,有些在某些情况下没有使用(因此是懒惰),但如果它们被使用,它们很可能会被重复调用。

不幸的是,这些属性也经常在类内部使用。这意味着私有变量 (_b) 有可能直接由方法使用,而无需对其进行初始化。

有没有办法在类中只提供公共属性(B),或者甚至是在需要时具有相同初始化的替代方法?

这是从程序员转发的(显然不够主观): https ://softwareengineering.stackexchange.com/questions/34270/best-methods-for-lazy-initialization-with-properties

0 投票
3 回答
104 浏览

php - 在 PHP 类中引用实例变量时执行方法?

是否可以在引用 php 类中的变量时运行函数,而不是简单地返回其值,类似于 javascript 变量保存方法的能力?