質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

6回答

19030閲覧

Javaで一度のみ外部の値で初期化でき、その後参照しかできない変数

tech_rui

総合スコア10

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2015/09/21 08:09

編集2015/09/21 16:35

Javaでクラスで一つで一度のみ外部の値(可変)で初期化を行え、その後はカプセル化して値を変更できない変数を作りたいです。

追記します。
わかりずらく、申し訳ないです。

回答をいただいている方にもあるよう静的(static)変数で「クラス名.変数」もしくは「クラス名.ゲッター()」
のようにすべてのクラスからアクセスしたく、できればセッターは設けたくないです。
初期化は一度のみ可能で、静的変数を持っているクラスのインスタンスの作成もできない(もしくはそれに近しい)手段があれば案を頂きたい所存です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
TetsujiMiwa

総合スコア1124

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

私は一度しか初期化を行わない様な場合は

デザインパターンのSingletonパターンを主に使用していますが、
似たような形で

public class Sample {
private static Object instance = null;

・・・

public getInstance() {
if(instance == null) {
初期化処理
}
return instance;
}

}

理由は最初に呼び出された時に初期化されるので、起動時に初期化処理集中して
起動時間遅くなる事を避ける為です。

投稿2015/09/21 14:49

pura90

総合スコア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
swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

1:privateなフィールドを宣言する。
2:アクセッサ内で値が入っているかを判定する。
3-1:値が無い場合は値を設定
3-2:値が有る場合は値の設定を拒否する。

投稿2015/09/21 08:25

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

arcanum_jp

総合スコア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
raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問