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

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

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

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

Q&A

3回答

10062閲覧

クラス間の変数の共有

token_regain

総合スコア25

Java

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

0グッド

1クリップ

投稿2015/07/19 11:59

java初心者です。

今、ある問題を解くために

実行するクラス(mainクラス)
問題を読み取るクラス
問題を変換するクラス
問題を解決するクラス

に分けてプログラミングしています。

問題を読み取るクラスでは問題のルールを記録しArrayListに記録します。
そしてこの結果は他の問題を変換するクラスや解決するクラスでも使いたいデータです。

そこで問題を読み取るクラスで作ったデータを、
例えば変更があればその変更が反映されたりするように
他のクラスにも共有させたいのですが、その場合の宣言の方法が分かりません。

オブジェクト指向を理解していないからだとは思うのですが、
何か助けになる説明が欲しいと思っています。

その中のデータをpublic staticにするのが正解なのでしょうか。
宜しくお願いいたします。

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

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

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

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

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

guest

回答3

0

データをPublic staticにするのはおすすめできません。
通常変更が無いデータを扱う方法なので、プログラムの仕様が変わった時にプログラムのどこでどの順序でなんのために変更されるかがわかりづらくなるためです。

オブジェクト指向の場合、名前の通りモノ(object)を真ん中にする考え方です。

確かにReaderとか”er”をつけて名詞化してクラス名にすることも有りますが、説明からするとクラスとしてで意義すべきは”問題”だと感じてます。

例えばこんなクラスはドウでしょうか?(的外れだったらごめんなさい)
➖”問題”は”ルール”によって定義(インスタンス化)され、解決(メソッド)することよって答えを返しますが、ルールの変更(メソッド)をすることによってルールの変換をすることができます。

Java

1public class 問題{ 2 private ArraList<String> ルール; 3 public 問題(ArrayList<String> ルール){...} 4 public void ルールの変更(変換クラス 変換){...} // 変換前のルールが残ってた方がいいのなら、戻り値は返還後の"問題"インスタンスにすると良い 5 public 回答 解決(){...} // 回答はString? 6}

投稿2015/07/19 15:47

編集2015/07/19 16:15
iwamoto_takaaki

総合スコア2883

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

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

0

問題を読み取るクラスをReadクラス,変換するクラスをTranceクラス,解決するクラスをSolveクラスとすると,イメージとしては

java

1List rule = new ArrayList(); 2Read read = new Read(rule); 3Trance trance = new Trance(rule); 4Solve solve = new Solve(rule);

と,このようになるのではないでしょうか.
今,read,trance,solveは同じListであるruleを参照しています.
言うなれば「同じ箱の場所」をそれぞれが持っています.
このruleの内容を変更しても,箱の中身が変わるだけで箱の場所は変わらないので,
変換,解決時にも変更後のruleが適用されます.

投稿2015/07/19 12:40

swordone

総合スコア20649

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

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

0

書かれている通り、オブジェクト指向について、あいまいな部分があるため
作られたいもののオブジェクト指向としてのイメージがいまいちつかめていないので
どうすればいいのかわからないのではないかと思います。

今回の場合、こうイメージしてみてください。

「問題をどこからか読み取ってくる部署」
「その人が読み取った問題を変換してくれる部署」
「問題を解決して答えを出す部署」
の3つの部署があります。

その3部署がうまく連携をとって答えを導き出したいのですが
部屋も違うので、お互いに声をかけることができません。

ではどうすれば良いかというと、その3部署の間やり取りする問題が入ったMailBoxを用意してあげて
そのMailBoxを各部署に入れたり、各部署から出したりすることで、情報の連携を行います。

MailBoxは
「問題を読み取ってくる部署」が問題を詰めて
「変換する部署」が受け取って、変換した後返して
「解決する部署」が受け取って解決する
物になります。

これをコードで表すと

java

1public class Main { 2 //mainクラスは3部署が所属する会社だと思ってください。 3 public static void main(String[] args) { 4 Read read = new Read(); 5 Question question = read.read(); 6 Convert convert = new Convert(); 7 question = convert.convert(question); 8 Solve solve = new Solve(); 9 solve.solve(question); 10 } 11} 12 13/** 14* 問題が入ったMailBox 15**/ 16public class Question { 17 private List<String> questionList; 18 public void setQuestionList(List<String> questionList) { 19 this.questionList = questionList 20 } 21 public List<String> getQuestionList() { 22 return this.questionList; 23 } 24} 25 26/** 27* 問題を読み取る部署 28**/ 29public class Read { 30 public Question read() { 31 //読み取り処理 32 } 33} 34 35/** 36* 問題を変換する部署 37**/ 38public class Convert { 39 /** 40 * 戻り値はなくてもquestionの中身は書き換わりますが<br/> 41 * 動きをイメージしやすいようにあえてreturnさせています。 42 */ 43 public Question convert(Question question) { 44 //変換処理 45 return question; 46 } 47} 48 49/** 50* 問題を解決する部署 51**/ 52public class Solve { 53 public void solve(Question question) { 54 } 55}

このように実装しておくと、例えば、Readが読み取った情報は
Convertしか理解できず、Convertが変換したものしかSolveは理解できない
というのであれば、Questionのフィールドに

java

1private List<String> convertedQuestion;

のようなものを追加してあげることで、簡単にやり取りができるようになります。

また、各部署は、ほかの部署が何をやってるのかを知る必要がなく
自分たちの仕事だけこなせばいい、ということになります。

投稿2015/07/21 09:08

MakotoMiyazaki

総合スコア297

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問