問題タブ [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.
performance - Scala遅延値:パフォーマンスのペナルティ? スレッドセーフ?
重複の可能性:
lazy val の (隠された) コストは? (スカラ)
Scala では遅延値の定義が可能
wheresomeCostlyInitialization
は の最初の使用時にのみ評価されますmaybeUnusedValue
。つまり、評価されるのは多くても 1 回であり、maybeUnusedValue
一度も使用されていない場合は、まったく評価されません。
これはスレッドセーフですか?これのパフォーマンスへの影響は何ですか?これをスレッドセーフにする場合は、ある種の同期化を使用するか、何らかの方法で Java volatile を使用する必要があります。残念ながら、Scala 言語仕様はこれについて何も述べていません。
java - Java で構成可能な列挙型
次のようなものを実装するためのより良いパターンを探しています:
enum
問題は、原因の副作用にアクセスすることです。DBBar
接続などを開きます。そのため、必要なだけでも、VAL2
セットアップの代償を払わなければなりませんVAL1
。
OTOH、 の値bar
は に密接に結合されていenum
ます。これは静的属性に似ていますがenum
、遅延初期化はありません。抽象化して匿名クラスを使用することもできFoo.getBar()
ますが、その場合、毎回セットアップ料金を支払う必要があります。
s の属性に遅延初期化を追加する安価な方法はありenum
ますか?
[編集]これを明確にするために:
getBar()
何百万回も呼ばれています。目がくらむほど速いに違いない。ここではシングルトンについて話しています (
enum
それ自体と同じように)。単一のインスタンスのみを作成する必要があります。追加のポイントとして、単体テストはこの動作をオーバーライドできる必要があります。
インスタンスは遅延して作成する必要があります。
Spring で値を Bean として登録するために試した 1 つの解決策:
これにより、実行時に値を指定し、テストでオーバーライドすることができました。残念ながら、これは何らかの方法で を にApplicationContext
注入する必要があることを意味します。enum
そのため、グローバル変数が必要です。うんざりする
さらに悪いことに、値を検索するのgetBar()
が遅すぎます。これを解決するためsynchronize
getBar()
に使用できます。if(bar!= null)bar=context.get(name()+".bar");
enum
しかし、値自体を使用するのと同じくらい安全で高速な、これなしの方法はありますか?
php - PHPで必要な場合にのみ変数をロードする方法
システムのさまざまな部分でオブジェクトが使用されている複数のパブリックプロパティを持つクラスがあります。問題は、クラスのオブジェクトを使用している各場所で、これらのパブリックプロパティの一部のみをロードする必要があることです。これは、プロパティのリスト全体を毎回ロードするのに永遠に時間がかかるためです。
__autoload
呼び出されたときに異なる変数をロードする関数を呼び出すために、または同様の関数を使用できる方法はありますか?
例えば
c# - C#には怠惰なキーワードが必要です
レイジー初期化を簡単にするために、C#にはレイジーキーワードが必要ですか?
例えば
それ以外の
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 を使用して実際のアイテムを取得し、オブジェクトなどにアクセスできます。もちろん、これはあるべき姿ではなく、そうあるべきです。
これが解けたらビックリです。
c# - 遅延インスタンスの初期化時にパラメーターをコンストラクターに渡す
私が知っているように、変数が宣言されている場合、プロパティLazy
を使用するとそのコンストラクターが呼び出されValue
ます。
このインスタンスにいくつかのパラメーターを渡す必要がありLazy
ますが、正しい構文が見つかりません。これは私のデザインではありません。私は MEF を使用しています。私のパーツのインスタンスがExportFactory
返されます。Lazy
私のパーツにはコンストラクターがあり、いくつかのパラメーターを使用してこれらのコンストラクターを呼び出す必要があります。
java - Spring 3.0 lazy-init は DefaultMessageListenerContainer で受け入れられませんか?
JMS のスプリング構成をセットアップしました。遅延ロードを行うことができないように見えることを除いて、問題なく動作します(以下のコードで default-lazy-init true に注意してください)。以下の構成から jmsContainer(DMLC) をコメントアウトすると、遅延読み込みが期待どおりに機能します。それ以外の場合は、DMLC がインスタンス化され、キューと接続ファクトリが作成されます。
私は何が欠けていますか?
jmsContext.xml:
そして、それを駆動するために使用しているテスト、DummyTest.java:
jmsContainer がコメント アウトされている場合、上記のテストはパスします。それ以外の場合は、次のようになります。
「connectionFactory」Bean は「jmsContainer」の依存関係としてインスタンス化され、失敗します。「jmsContainer」をコメントアウトすると、「connectionFactory」がインスタンス化されません。
jms コードは問題なく動作しますが、JNDI 名を意図的に変更して、開始時期を確認できるようにしました。
.net - WebSessionContext/CurrentSessionContext を使用した ISession の遅延初期化
NHibernate 3 で新しいプロジェクトを開始しており、WebSessionContext で CurrentSessionContext API を使用して ISession オブジェクトを管理しようとしています。
以前のプロジェクトでは、私は常にそれを自分で管理していたので、ISession オブジェクトが必要になるたびに、それを作成して HttpContext.Items コレクションに格納していました。非常に簡単ですが、この新しいプロジェクトにはネイティブ ソリューション (CurrentSessionContext) を使用するのが最適なオプションのようです。
オブジェクトを管理したときに、遅延初期化を行うことができました。つまり、すべてのリクエストではなく、必要なときにのみセッションを開くことができました。これは、必要ない可能性があり、すべてを開くことでリソース/時間を浪費するためです。時間。
CurrentSessionContext API でそれを行う簡単な方法はありますか?
これを担当する HttpModule で使用しているコードは次のとおりです。
編集
Diego はほぼ完璧にやり遂げましたが、私はこれについてもう少し考え、私がそのコントロールを自分で実装した主な理由を思い出しました: トランザクションです。
私はオニオン アーキテクチャの専門家なので、ドメイン オブジェクト (いつトランザクションを開始するかを知っているオブジェクト) はインフラストラクチャにアクセスできないため、トランザクションを開始できません。
これを解決するために、遅延初期化を使用し、セッションを開くときに常にトランザクションを開始します。コミットは、リクエストが終了し、例外がキャッチされなかったときに発生します。これに加えて、クエリを実行する場合でも、常にトランザクションを使用するという Ayende のアドバイスがあります。何かご意見は?
c# - プロパティを使用した遅延初期化のメソッド
現在、広く使用されているクラスを変更して、高価な初期化の多くをクラス コンストラクターから Lazy Initialized プロパティに移動しています。以下に例を示します (c# の場合):
前:
後:
私が変更しているクラスには、これらのプロパティがかなり多くあり、特定のコンテキストでは使用されないものもあります (したがって遅延)。ただし、それらが使用されると、繰り返し呼び出される可能性があります。
残念ながら、プロパティはクラス内でも使用されることがよくあります。これは、プライベート変数 (_b) が初期化されずにメソッドによって直接使用される可能性があることを意味します。
クラス内でパブリック プロパティ (B) のみを使用できるようにする方法はありますか?
これはプログラマーから再投稿されたものです (明らかに主観的ではありません): https://softwareengineering.stackexchange.com/questions/34270/best-methods-for-lazy-initialization-with-properties
php - PHPクラスでインスタンス変数が参照されたときにメソッドを実行しますか?
変数がメソッドを保持するjavascriptの機能と同様に、単にその値を返すのではなく、phpクラスの変数を参照するときに関数を実行することは可能ですか?