Javaでクラスで一つで一度のみ外部の値(可変)で初期化を行え、その後はカプセル化して値を変更できない変数を作りたいです。
追記します。
わかりずらく、申し訳ないです。
回答をいただいている方にもあるよう静的(static)変数で「クラス名.変数」もしくは「クラス名.ゲッター()」
のようにすべてのクラスからアクセスしたく、できればセッターは設けたくないです。
初期化は一度のみ可能で、静的変数を持っているクラスのインスタンスの作成もできない(もしくはそれに近しい)手段があれば案を頂きたい所存です。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
私は、インスタンス生成時に、引数で設定してあげる方法をよく使います。
public class Sample { private final String hoge; public String getHoge() { return hoge; } public Sample(String hoge) { this.hoge = hoge; } }
そのクラスに変数をもたせるのは諦めて、他のインスタンスで変数を持たせてみるのはいかがでしょう。
例えば、Mapにその当該オブジェクトをキーに、変数を値としてセットし、他のクラスから呼び出して使う。
なお、Mapを変更不可とするには、Collections.unmodifiableMap(map)を使用する。
投稿2015/09/21 10:45
編集2015/09/21 20:51総合スコア1124
0
私は一度しか初期化を行わない様な場合は
デザインパターンのSingletonパターンを主に使用していますが、
似たような形で
public class Sample {
private static Object instance = null;
・・・
public getInstance() {
if(instance == null) {
初期化処理
}
return instance;
}
}
理由は最初に呼び出された時に初期化されるので、起動時に初期化処理集中して
起動時間遅くなる事を避ける為です。
投稿2015/09/21 14:49
総合スコア32
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
基本的にはyonaさんの回答で十分だと思います.
もし「クラスで一つ」がstatic変数のようなものであれば1.をprivate staticにすればいいですし,
その変数が「初期化されていない状態」を示す値が使えない場合(intの場合は0や負の数含め取りうる値すべて初期化値としてあり得る,参照型はnullでの初期化もあり得るような場合),
「初期化されたかどうか」のprivate static booleanフィールドを設け,初期化前にそのbooleanをチェックすることで設定の可否を判定する方法もあります.
セッターを設けずに1度のみの初期化を許すと言うのは無理な話だと思います.
staticフィールドなのでfinalにすると外部からの情報で初期化は無理ですし(静的初期化子では外部から情報を受け取れない).
シングルトンにして初期化処理メソッドを設ける方法も考えられますが,インスタンス化することの意味はさほどありませんし,そもそも取りようによってはこれもセッターになります.
投稿2015/09/21 09:25
編集2015/09/21 16:51総合スコア20649
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
既に終わっている問題でしかも2015年なので届くかどうかわかりませんが・・・
初め質問から次のどっちかなと思いましたが追記から2の定数定義クラスが知りたいという話ですね。ハードコードしないでアプリケーション開始時に任意の値を設定したいという要求
1.イミュータブルなクラス設計
2.定数を定義したクラス
であれば、普通にクラスのpublic static final で定義した値にプロパティクラスから値を設定するという方法で良いと思います。
多分開発環境~本番環境で値を変えたいと言った事がしたいのでしょうか?
public class Hoge {
public static final FUGA = MyProperties.getProperties("fuga").; public static final HAGE = MyProperties.getProperties("hage").;
}
public class MyProperties extends Properties {
// 特定のプロパティから取得するクラス
}
投稿2018/08/09 12:15
総合スコア94
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
ちょっと作ってみましたが、下記のような感じでしょうか?
FamilyPerson.java
Java
1/* 2 共通の名前を初期化時にいれて、その後変更できないようにする。 3 マルチスレッドには未対応のため、マルチスレッドで使用する場合は、 4 適当に排他処理を入れながらな使うこと! 5 */ 6public class FamilyPerson { 7 // static 8 private static boolean initialized = false; 9 private static String commonName = null; 10 static boolean initialize(String commonName) { 11 if (FamilyPerson.initialized) { 12 return false; 13 } else { 14 FamilyPerson.commonName = commonName; 15 FamilyPerson.initialized = true; 16 return true; 17 } 18 } 19 static FamilyPerson create(String name) { 20 if (FamilyPerson.initialized) { 21 return new FamilyPerson(name); 22 } else { 23 return null; 24 } 25 } 26 // instance 27 private String name; 28 private FamilyPerson(String name) { 29 this.name = name; 30 } 31 public String getFullName() { 32 return this.commonName + " " + this.name; 33 } 34}
Main.java
Java
1class Main { 2 public static void main(String[] args) { 3 FamilyPerson a, b, c; 4 // a = new FamilyPerson("太郎"); // privateなため直接作成はできない。 5 a = FamilyPerson.create("太郎"); // 初期化前なのでnullが返ってくる。 6 if (a == null) { 7 System.out.println("aの値がnullです。"); 8 } else { 9 System.out.println("aのフルネームは" + a.getFullName() + "です。"); 10 } 11 FamilyPerson.initialize("佐藤"); // 初期化 12 b = FamilyPerson.create("次郎"); // 初期化後なのでnullが返ってくる。 13 if (b == null) { 14 System.out.println("bの値がnullです。"); 15 } else { 16 System.out.println("bのフルネームは" + b.getFullName() + "です。"); 17 } 18 FamilyPerson.initialize("鈴木"); // 再度初期化しようとするけど、変更されない 19 c = FamilyPerson.create("三郎"); // 初期化前なのでnullが返ってくる。 20 if (c == null) { 21 System.out.println("cの値がnullです。"); 22 } else { 23 System.out.println("cのフルネームは" + c.getFullName() + "です。"); 24 } 25 } 26}
実行結果
$ javac FamilyPerson.java $ javac Main.java $ java Main aの値がnullです。 bのフルネームは佐藤 次郎です。 cのフルネームは佐藤 三郎です。
投稿2015/09/21 22:33
編集2015/09/21 22:37総合スコア21733
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。