• ベストアンサー

変数について

プロパティファイルから読み取った値をほかのクラスから使いたいと考えて以下のような2つのクラスを作成しました。 [プロパティ読み取り] public class Admin{ public static String HOST; public static String ACCOUNT_NAME; public static String ACCOUNT_PASSWD; /** * * @throws java.io.IOException */ public Admin() throws IOException{ try{ // read from properties file.      Properties pro = new Properties(); pro.load(new FileInputStream("プロパティファイル")); HOST = pro.getProperty("host"); ACCOUNT_NAME = pro.getProperty("account.name"); ACCOUNT_PASSWD = pro.getProperty("account.password"); }catch(Exception e){ System.out.println(e); } System.out.println("Host: "+ HOST); System.out.println("User: "+ ACCOUNT_NAME); System.out.println("Password: "+ ACCOUNT_PASSWD); } } [変数使用] public class Update { public static void main(String[] args) { System.out.println("Host: "+ Admin.HOST); System.out.println("User: "+ Admin.ACCOUNT_NAME); System.out.println("Password: "+ Admin.ACCOUNT_PASSWD); } } Adminクラスの出力では、変数に正しい値がセットされていますが、Updateクラスではnullが返ります。 スコープの問題かと思うのですが、どこをどのように改良したらよいかわかりません。 nullではなく、正しい値を取得するにはどのようにすればよいでしょうか

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

  • ベストアンサー
回答No.1

http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000599.html Javaがわかっている人間でもないけどね。 import java.io.*; import java.util.*; public class Admin{ public static String HOST; public static String ACCOUNT_NAME; public static String ACCOUNT_PASSWD; /** * * @throws java.io.IOException */ static { try{ // read from properties file. Properties pro = new Properties(); pro.load(new FileInputStream("Admin.properties")); /* ファイルがあることが前提。まあなくてもprintInでjava.io.FileNotFoundException: Admin.propertiesって言われるけど。 */ HOST = pro.getProperty("host"); ACCOUNT_NAME = pro.getProperty("account.name"); ACCOUNT_PASSWD = pro.getProperty("account.password"); }catch(Exception e){ System.out.println(e); } System.out.println("Host: "+ HOST); System.out.println("User: "+ ACCOUNT_NAME); System.out.println("Password: "+ ACCOUNT_PASSWD); } } としたら何かうまくいっちゃった。(staticなのを使う場合,newされないからコンストラクタ実行されないんじゃないかなーと予測してみただけ。)

その他の回答 (2)

noname#33813
noname#33813
回答No.3

No.1回答者様様の >staticなのを使う場合,newされないからコンストラクタ実行されないんじゃないかなーと予測してみただけ。 が正解ですので一応説明をいれます。 >public Admin() throws IOException{ というのはコンストラクタですので、ここに記述されているロジックは Admin admin = new Admin(); でインスタンス化しないと動きません。 コンストラクタに記載する処理というのは、通常インスタンス化する際の初期処理を記述します。 今回は、インスタンス化せずに使うということですので、コンストラクタで処理するのは不適切です。 そこで static { で括ることにより、クラス初回ロード時に処理されるようにします。 これをstaticイニシャライザと呼びます。

arne1000
質問者

お礼

ありがとうございます。 細かい説明までしていただきまして、理解が深まりました。

回答No.2

一応。 /* ======Update.java========= */ public class Update { public static void main(String[] args) { System.out.println("UpdateStart"); System.out.println("UpdateHost: "+ Admin.HOST); System.out.println("UpdateUser: "+ Admin.ACCOUNT_NAME); System.out.println("UpdatePassword: "+ Admin.ACCOUNT_PASSWD); } } /* ======Admin.java========= */ import java.io.*; import java.util.*; public class Admin{ public static String HOST; public static String ACCOUNT_NAME; public static String ACCOUNT_PASSWD; /** * * @throws java.io.IOException */ static { try{ // read from properties file. Properties pro = new Properties(); pro.load(new FileInputStream("Admin.properties")); /* ファイルがあることが前提。まあなくてもprintln(さっきprintInって打ったけど間違い)でjava.io.FileNotFoundException: Admin.propertiesって言われるけど。 */ HOST = pro.getProperty("host"); ACCOUNT_NAME = pro.getProperty("account.name"); ACCOUNT_PASSWD = pro.getProperty("account.password"); }catch(Exception e){ System.out.println(e); } System.out.println("Admin Start"); System.out.println("AdminHost: "+ HOST); System.out.println("AdminUser: "+ ACCOUNT_NAME); System.out.println("AdminPassword: "+ ACCOUNT_PASSWD); } } /* って方が動き解りやすい? */

arne1000
質問者

お礼

丁寧な解説ありがとうございます。 非常にわかりやすいです。 よく理解できました、ありがとうございました。

関連するQ&A