重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

プロパティファイルから読み取った値をほかのクラスから使いたいと考えて以下のような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ではなく、正しい値を取得するにはどのようにすればよいでしょうか

A 回答 (3件)

http://www.kab-studio.biz/Programing/JavaA2Z/Wor …

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されないからコンストラクタ実行されないんじゃないかなーと予測してみただけ。)
    • good
    • 0

No.1回答者様様の


>staticなのを使う場合,newされないからコンストラクタ実行されないんじゃないかなーと予測してみただけ。
が正解ですので一応説明をいれます。

>public Admin() throws IOException{

というのはコンストラクタですので、ここに記述されているロジックは
Admin admin = new Admin();
でインスタンス化しないと動きません。
コンストラクタに記載する処理というのは、通常インスタンス化する際の初期処理を記述します。
今回は、インスタンス化せずに使うということですので、コンストラクタで処理するのは不適切です。

そこで
static {
で括ることにより、クラス初回ロード時に処理されるようにします。
これをstaticイニシャライザと呼びます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/05/12 03:06

一応。


/* ======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);

}
}

/* って方が動き解りやすい? */
    • good
    • 0
この回答へのお礼

丁寧な解説ありがとうございます。
非常にわかりやすいです。

よく理解できました、ありがとうございました。

お礼日時:2007/05/12 03:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!