1

シングルトン クラスの Phone を作成して、(数値で) 初期化可能であり、同時に安全であるようにしたいと考えています。だから、ここに私が来たものがあります:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;


public class PhoneTest {
    public static void main(String... args){
        System.out.println(Phone.getInstance().getNumber());
    }

    static final class Phone {
        private final String number;
        private final static Phone instance;
        static {
            instance = new Phone(PhonePropertyReader.readPhoneNumber());
        }

        private Phone(String number) {
            this.number = number;
        }

        public static Phone getInstance() {
            if (instance == null) throw 
                new IllegalStateException("instance was not initialized");
            return instance;
        }

        public String getNumber() {
            return number;
        }
    }


    static final class PhonePropertyReader {
        static String readPhoneNumber() {
            File file = new File("phone.properties");
            String phone = "";
            System.out.println(file.getAbsolutePath());
            if (!file.exists()) {
                return phone = "555-0-101";
            }

            try {
                BufferedReader r = new BufferedReader(new FileReader(file));
                phone = r.readLine().split("=")[1].trim();
                r.close();
            } catch (IOException e) {

            }
            return phone;
        }
    }
}

また、 phone.properties を含むファイルがあります

phone=12345

それは良い解決策ですか?同時安全ですか?

4

2 に答える 2

1

Javaでスレッドセーフなシングルトンを実装するには、 Enumが依然として最良の方法であると私は信じています。

于 2013-04-14T17:40:42.417 に答える
0

シングルトンの使用をお勧めしません(この他の質問を確認してください

それ以外の場合、コードはスレッドstatic {}セーフです。これは、定義上、スレッド セーフである領域に影響を与えるだけであるためです。

ところで、メソッドをクラスreadPhoneNumber()に直接組み込んでみませんか?phone

于 2013-04-14T17:25:00.497 に答える