• ベストアンサー

効率よくリソースを読みこむには

複数ウィンドウを開きますが、メニューはすべて同じ文字列を使用します。 メニューの文字列をリソースファイルから ResouseBundleを使用して取得したいのですが、 複数のウィンドウすべてでいちいちファイルを読みこんでいては無駄になるとおもうので、一度読みこんだらあとはそれを使いまわせるようにしたいのです。 staticとかfinalを使って可能かとおもったのですが…。 どうにも頭がこんがらかってしまい、うまく出来ません。 おなじような設計をしたかたがいらっしゃいましたら アドバイスをよろしくお願い致します。

  • Java
  • 回答数3
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • stardust
  • ベストアンサー率44% (8/18)
回答No.1

先ず初めに、、、 色々と設計の仕方はあると思いますが、静的アクセスの利用(= static 宣言)というのは、一つのアプローチとしてよい方法だと思いますよ。 頭がこんがらがっているとのことですが、デザインパターンのSINGLETONパターンを応用すれば設計をまとめることができると思います。 具体的には、 ・リソースバンドルを管理するためのクラスを用意する ・そのクラスにリソースバンドルインスタンス取得用のstaticメソッドを用意する 例えば、雰囲気だけ書きますと以下のようなります。 ----------------------------- public class MyResource {  private static MyResource instance = null;  java.util.ResourceBundle rb = null;  protected MyResource()  {   // リソースバンドル rb の初期化処理を行う  }  public static java.util.ResourceBundle getResourceBundle()  {   if (instance == null) instance = new MyResource();   return instance.rb;  } } 他のクラスからリソースバンドルを利用するときには  java.util.ResourceBundle rb = MyResource.getResourceBundle(); で取得できます。 ----------------------------- と、このようなクラス設計をして、リソースバンドル使用側で確実にMyResource経由でリソースバンドルインスタンスを取得するようにすれば、一つのリソースバンドルインスタンスを使いまわすことができるはずです。 ここからは余談です。 既にデザインパターンについてご存知ならば失礼いたしますが、、、 デザインパターンという、一般的な設計手法をまとめたものが存在します。 デザインパターンは設計を考える上で非常に有用ですし、興味深いものです。 # まるで手品を見ているような、素晴らしいデザインパターンがいくつも提唱されています。 是非デザインパターンを勉強されることをお勧めします。

tontoto
質問者

お礼

ありがとうございます!お礼が遅くなって申し訳ありませんでした。 このお礼に気づく前に以下のように無理やりソース組んでから気づきました。 そこで「stardustさんの例ではResourceBundleを使いまわしてるけど、 ResourceBundleから取得した文字列そのものを使いまわすほうが早いだろうか」 (つまり、リソース読みこみの時間はResourceBundleを得る時間が長いのか、  そこから文字列を得る時間は無視できるほど小さいのか…?) という疑問がわいてきてしまってお返事が遅くなりました。 実験して確かめてからお返事しようと思っていたのですが、 なかなか時間が取れなくて…。 でも良く考えて見たら、ResourceBundleのインスタンスをreturnする メソッドじゃなく、それぞれのStringをreturnするメソッドを作れば 文字列そのものを使いまわすことがちゃんとできますよね。 なので、ここからは純粋に興味なのですけど、 もし理論的に上記の疑問の答えがおわかりでしたら 申し訳ありませんが教えていただけませんか? また、近いうちに実験してみるつもりなので、 その結果がでてからこの質問を締めきりたいとおもっています。 ポイントの発行など、しばらくお待ちください。よろしくお願いします。 それから「デザインパターン」。 言葉は知っていたけど難しいことなのかと思って食わずぎらいしていました。 これを機会に少し本をみてみたら、 stardustのおっしゃる通り、すばらしい例が載っていて、感動しました。 ものすごく役に立ちそうです。 ほんとうにありがとうございました。 /*今となっては間抜けなソース*/ public class A { //リソースから取得する文字列 static String strA; static String strB; static String strC; static String strD; static String strE; /** *コンストラクタ */ public A() { //文字列まだ読みこんでなかったら if(strA == null ) { //文字列リソース読みこみ getMyResource(); } System.out.println("strA="+strA+"...."); } /** *リソース読みこみのためのメソッド */ static void getMyResource() { try { java.util.ResourceBundle myResource; myResource = java.util.ResourceBundle.getBundle("myResource"); //文字列読みこみ strA = consoleResource.getString("a"); strB = consoleResource.getString("b"); strC = consoleResource.getString("c"); strD = consoleResource.getString("d"); strE = consoleResource.getString("e"); }catch (java.util.MissingResourceException e){ } } }

その他の回答 (2)

  • stardust
  • ベストアンサー率44% (8/18)
回答No.3

> いま作ろうとしているシステムがものすごく遅くなりそうなので、 > 少しでも早くできそうなところは短縮するようにとの > 命令がでてしまいました。 大変そうですね。 どういうシステムを作られているのか判りませんが、 データベースを扱うシステムでは、注意して設計しないと システム全体のパフォーマンスを著しく低下させることになります。 後、今すぐ思いつくのは ・長い文字列を(テキストエディタ並に)扱う場合はStringBufferを使うこと ・プロセス間通信は時間を食うので、無駄な通信を極力減らすこと で、パフォーマンスをアップさせることができます。 tontoto さん、これからも頑張って お互い勉強していきましょう!

tontoto
質問者

お礼

ほんとうにありがとうございます。 参考にいたします。 実は重いのはGUI部分なのです。 Swing使ってるので…。 しかもさらにその下には通信が走って…。ぅぅ。 データベースは扱わないのですが…。 ユーザさんに強制終了されかねないので、 ちょっとでも早く…。とおもっています。 プロセス間通信…。 亀のようにのろい歩みですが、頑張って勉強していきます。またよろしくおねがいします。 今回は本当にありがとうございました。 …このシステムて20ポイントが最高なんですね…。たりない…。

  • stardust
  • ベストアンサー率44% (8/18)
回答No.2

tontotoさん、こんばんは。 確かにtontotoさんが補足で書いておられる方法のほうが断然速いですね。 簡単なサンプルを書いて処理時間を計測してみました。 ------------------- 環境はPentium3 450MHz のノートパソコン、JDK1.2.2。 10万回の文字列取得処理を10回繰り返した平均値を計測しました。 tontotoさんの方法では、1ミリ秒以内。 前回の私の回答の方法で、約400ミリ秒です。 ------------------- クラスメンバとして持たしてしまえば、メモリ上の位置が決まっているのに対し、 リソースバンドルは逐一、キーから値を検索し、新しいStringインスタンスを生成するのでこのくらいの差はつくのでしょうね。 フレームのメニュー文字列を取得する目的ならば、無視できる差ですよね? となると、後は実行速度とメンテナンス性の兼ね合いでしょうか。 それはtontotoさんのお考え次第です!

tontoto
質問者

お礼

ああ、速度の実験まで…。 なにからなにまで申し訳ありません。 本当にありがとうございます。 stardustさんに教えていただいたSINGLTONのやり方で 取得するStringインスタンスも シングルトンのクラスのなかにかけないものかと思ったのですけれど…。 (getMenuStringメソッドとか定義してstaticなStringを返すように…) これはこれでごちゃごちゃしてるように見えるかな…。 と考えています。 10万回の文字列取得を10回でも400ミリ秒ということですので、 これなら性能的にそんなに影響ないでしょうし、 ソースも綺麗なのでstardustさんに教えていただいたやり方でやろう、 と個人的に思ったのですが。 いま作ろうとしているシステムがものすごく遅くなりそうなので、 少しでも早くできそうなところは短縮するようにとの 命令がでてしまいました。 そこで結局今回は Stringもstaticにするやり方をとることになりました。 でもすごく役に立ちました。 これからも役立つ知識教えていただきましたし…。 本当に本当にありがとうございました。

関連するQ&A

  • C++/CLIのリソースファイルについて

    C++/CLIのリソースファイルについて質問です。 環境は、Visual Studio 2005のC++/CLIです。 アセンブリリソースファイル(resx)の文字列リソースをEXEファイルをに含めることは可能でしょうか? 含めるか、含めないかの設定はどこで可能でしょうか? 現在は、EXEファイルと同じ場所にアセンブリリソースファイル(resx)がないと例外が発生します。

  • Androidアプリで別環境でのリソース取得

    Androidアプリを開発していまして、プログラミングの知識はある方の部類だと思っています。 Androidアプリでのリソースを取得するとき、実行する環境にあった文字列やdrawable等を取得できるのは知っています。 ここで、プログラム上から別環境のリソース(例えば文字列)を取得することは出来るのでしょうか? 具体的にしたいことは、アプリの多言語化なんですが、ほとんどは端末にあった言語の文字列を使いたいのですが  ある部分だけに「日本語」を使いたいのです。 例えば、たくさんのボタンがあって それを押したら「日本語」で 〇〇を押しましたと出したいのです。 英語の環境では   "Hello" , "Good Night"    ー>「おやすみ」を押しました。 日本語の環境では  "こんにちは" , "おやすみ" ー>「おやすみ」を押しました。 ○語の環境では    "○○","△△"        ー>「おやすみ」を押しました。 管理しやすいようにしたいので、文字列リソースを strings.xmlに書きたいところなんですが 、別環境での文字列を取得する方法がわからなかったので 質問いたしました。 自分で、文字列を管理する独自クラスを作ってハードコーディングしてもいいのですが、やはり strings.xml に書きたいなと思っています。 文字列の管理を簡単にしたいので、少々長い処理が必要になってもいいです。 (なるべくAndroid2.2以上を対象としてますが、無視していただいても構いません) 以上よろしくお願いいたします。

  • リソースファイルとは・・・

    リソースについて、2つ疑問が沸きました。 もしよろしかったら、アドバイスよろしくお願い致します。 (1)最近まで、Visual C# .NETを使用しておりました。 さきほど、Visual C++ .NETをいろいろいじっていたのですが、C++にはリソースというフォルダがあって、C#にはないのか疑問になりました。 どうしてC++では、リソースとして明確に分けているのかどうしてもわかりません。(そういえば、C#では、多言語に対応できないのかな・・・!?) (2)C#では、たとえば、メニューのキャプションを変更したりといったことは、コードと同じように編集できるのに、どうしてC++では、わざわざリソースエディタのメニューデザイナで編集させているのでしょうか? あと、リソースエディタの中にダイアログと言う項目があるのも不思議でなりません。ダイアログもフォームなのにリソースなんでしょうか?(リソースファイルとして保存して何か意味あるのでしょうか?)

  • リソースメータでリソースがでてこない?

    WINDOWS XPを使っています。 メモリは512+256MBです。 フリーソフトで”めもりーくりーな”というものがありますが、 このソフトでは、CPU負荷、メモリ使用量、スワップ、リソースの各々使用量が常駐で見ることができます。 ある日、ネットゲームをしていて(多分)、フリーズして、 それ以来、リソースの表示が出てこなくなたのです。 (メータの表示が常にゼロ) 何かシステムが壊れてしまったのでしょうか。 WINDOWSのみを再インストールすれば直るとおもいましたが、 バックアップディスクに一括で組み込まれているため、 すべての再インストールとなりそうです。 本当に何か不具合なのか、もしくは直す方法など何かありますでしょうか。 基本的にリソースがなにの為に必要なのかも、あまりわかっておりません。 宜しくおねがいします。

  • C#で文字列リソースを扱う

    引数でファイル名を絶対パスで読みこんで処理をする、というコンソールアプリを作成しています。 エラーメッセージなどをリソースで管理しているのですが、内容を動的に変更したいとき、どうすればよいのかわからず、困っています。 (たとえば、こういう感じです。) リソース登録された文字列 "指定されたファイル'{1}'はありません。"           ↑  ここに引数で受け取ったファイル名を入れたい。 このようなリソースの作成方法や、呼び出し方法を、どなたかご教授ください。

  • エクセルのリソース不足

    エクセル2003で列全体を指定して文字の中央揃えをしていたら 突然 「リソース不足のため、このタスクを完了できません。 選択するデータを少なくするか、ほかのアプリケーションを 終了して再度試してくださ」 とメッセージがでました。 確かに大きなファイル(50MB)でマクロも数式もたくさん使用していますが こんなのは初めての経験なので驚いています。 このとき ほかのアプリケーションは起動させていませんでした マクロの変数宣言でリソースを使い過ぎているのでしょうか 選択するデータを少なくすればこのまま使い続けられるか不安です 対処法を教えてください

  • (UWSC)このような場合、解決策はありますか?

    UWSCで、下記のようなことをしようと思っています。 GETSTRで、あるウインドウにある文字列を取得し、 その文字列をFPUTでファイルに書き込みます。 FPUTでは、CSVファイルに書き込みます。 GETSTRで取得する文字列は、少々長いメモが書き込まれている ような箇所で、複数行あります。 改行があることから、FPUTで書き込むとき、例えばそれが5行あれば、 2行1列目(セルA2)にそれを書き込もうとすると2行1列~6行1列(A2~A6) に書き込まれます。 セルA2だけに複数行全てを書き込むことはできないでしょうか? (繰り返し実施することから、1行に1項目しか入れたくないので・・・) 最大10行ということが決まっているので、10行おきに書き込むという 技もありますが、空行は作りたくないので・・・。 よろしくお願いします。

  • 日英対応のメニューの作り方

    CでWindowsのプログラム作っています。 メニューの文字が現在、日本語で表示するようにプログラムしていますが、英語表示版が必要になりました。リソースファイルを書き換えて再コンパイルすれば英語版ができるのはわかりますが、もっとスマートな解決策ありませんか? たとえば、外部ファイルとして日本語、英語メニュー文字列を用意しておいて、起動時にどちらかを読み込んで、そこの文字列を表示するとか、日本語版、英語版のメニューをあらかじめプログラムに埋め込んでおいて、実行時のオプションメニューなどで表示を切り替えるなどです。 具体的なテクニックとそのためのコーディングお教えください。 なお、リソース・エディタは、「BCCForm and BCCSkelton」を使っています。

  • Java Struts メッセージリソースの使い方

    JAVA Strutsを使用 各種メッセージを外部ファイルで定義しようと考えています。 Strutsではメッセージ・リソースファイルというものが存在するらしく、それを使用するのが妥当のようです。 http://www.javaroad.jp/opensource/js_struts5.htm しかしここではjsp側のbean:writeタグで表示する方法しか書いておりません。 メッセージをポップアップで表示させようと思っているのですが、どのようにすれば実現できるでしょうか。 .jsp-------- <script lauguage="JavaScript"> function checkErr(){ var msg = document.forms[0].err.value; if(msg != ""){ alert(msg); } document.forms[0].err.value = ""; } </script> Action.java------------ if(!Error.IsNum(id) || !Error.IsNum(pass)){ //ここでリソースファイルから文字列を取得したい msg = ""; logFrm.setErr(msg); return mapping.findForward("loginTop"); }

    • ベストアンサー
    • Java
  • リソース不足?

    自作、XPモデルでの使用ですが、Webページ(IE)を複数開くと、『まれ』にどんどん処理速度が遅くなり、最後にはタスクマネージャーも起動不可。スタートメニュー、終了さえもできなくなってしまいます。 XPなのに9X系リソース不足かのような状況。?? 気になるのはこの時決まって、ウイルスバスターアイコンが真っ黒になっていることです。 未熟な私めの組み立て不良かもしれませんが、情報がございましたらお願いします。

専門家に質問してみよう