チョコミントアイス

プログラミング初心者です
プログラミングの勉強をしており問題をやっている最中ですが、まわりに聞ける人もおらず,正解もわからず苦戦しております。そこでプログラミングができる方に教えていただきたいです。
問題文にFile型変数を使ったコンストラクタを定義するとありますが、どのような風にこのプログラムに組み込めばいいかわかりません。(これをやらなくても指定したファイルに出力させることはできています。)またこのコードにはsetter文が書かれているのですが、うまく使いこなせていないと思います。他にもいろいろおかしな点はあると思いうのですが
おかしな点を指摘していただき、正しいものを教えていただきたいです。

写真のものは、自分なりのコードを書いてみたものです(恥ずかしながら綺麗でないコードになっていると思います)
≪問題文≫
新規クラスを定義し、以下の内容を実装し動作するクラスを作る
① String変数をクラスのメンバー変数として定義し、文字列”hello world”を代入して初期化する
② File型のメンバー変数を定義し、出力先ファイルとして使用する
③ このFile型変数を使ったコンストラクタとgetter/setterを定義し、String型を引数に取り出力先に書き出すメソッドを定義する。
④ そのうえで、メインメソッド内でこのクラスを初期化して”hello world”を指定したファイルにfor文を用いて3回出力させること(3行)

プログラムのコード
package simonmon;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class Maxsimon {

private String word = "hello world";

public static void main(String[] args) {
Maxsimon as = new Maxsimon();

File fileB = new File("C://Users/bi19029/documents/test2/"); //書き出し先指定

fileB.mkdir();
String a = "test3";
String b = ".txt";
try {
fileB = File.createTempFile(a,b,fileB);
BufferedWriter bw = new BufferedWriter(new FileWriter(fileB));

for(int i=0; i<3; i++) {
System.out.println(as.getWord()); //getter出力
bw.write(as.getWord()); //getter書き出し
bw.newLine(); //行替え
}
bw.close();

} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}


}
public void setWord(String A) {
this.word=A;
}
public String getWord() {
return word;
}
}

「プログラムのコードを見ていただきたいです」の質問画像

A 回答 (1件)

うーん、Javaってやっぱ今や人気ないのか?何で誰もレスつけねぇんだろう・・・・・・。



断っておきますが、僕は全然Java分かりません。
ついでに言うと、プログラムは基本的に「動けば良い」と思ってるんで、動けばそれは正解。動かなければ間違ってる。ただそれだけだと思っています。
んで、僕のバックグラウンドを話しておくと、Pythonは使えます。そしてPythonでもオブジェクト指向は使えますが、ただ、そもそも、個人的にはオブジェクト指向があまり好きじゃないです。
で、「現代オブジェクト指向の立役者/雄」、JavaだとPythonで書くようなオブジェクト指向をどのように表現するのか、ちょっと興味がある程度。

と言うわけで、ちと苦労しました。そもそも、話ではJavaのgetter/setterの事は聞いた事ありますが、具体的に何する為のモノなのかサッパリ知らない。Pythonだとそういう概念が無いんですよ(機能的にはあるのかもしれませんが)。
んで、Javaのコードとしては貴方の書いたモノより稚拙でしょう。ただ、「余計な事はしてない」ので、貴方なら多分「簡単に書かれたモノ」の方が解釈は易く、より良く出来るのではないか、と。

基本的に①〜④の流れに従っただけ、です。恐らく題意としては、コンストラクタを定義する際に、直接、メンバ変数を取りに行かず、getter/setterを経由して初期化するように設定しろ、って言ってるだけだと思うんですけどね(Java知らんので、それをやるのが大変でしたが・笑)。そして、③の「ファイルに書き込むメソッド」なんですが、「String型を引数に取り出力先に書き出すメソッド」と指定されてる以上、まだこの時点では書き込まれる文字列がメンバ変数(でいいのか?"Hello World"の事)を直接埋め込まずに汎用に書け、と。多分そういう事を指定してるんだと思います(メンドくさ・笑)。
それで、

> メインメソッド内でこのクラスを初期化して

って④で言ってるんですが、これは例えば(こちらが作った)Fooクラス内にmainを作って、thisでクラス内のメソッドを参照して実行するようにしろ、って言ってるんですかね?ちょっとその辺、こっちじゃ判断出来ないんで(Java知らんから・笑)、別に分けてあります。
うーん、Javaって難しい。まぁ、参考までに。

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

class Foo {

 private File fileB; // ② File型のメンバー変数を定義し、出力先ファイルとして使用する

 Foo(String filepath) { // ③ ②のFile型変数を使ったコンストラクタを定義
  setData(filepath); // setter を使ってるんで、File型変数を(結果)使ってる事になってる筈
 }

 public File getData() { // ③ ②のFile型変数を使ったgetterを定義
  return fileB;
 }

 public void setData(String filepath) { // ③ ②のFile型変数を使ったsetterを定義
  fileB = new File(filepath);
 }

 public void write(String word) { // ③ String型を引数に取り出力先に書き出すメソッドを定義する。
  try {
   FileWriter filewriter = new FileWriter(getData(), true);

   filewriter.write(word);

   filewriter.close();
  } catch(IOException e) {
   System.out.println(e);
  }
 }
}


class Main {
 public static void main(String[] args) {
  String word = "hello world\n"; // ① String変数をクラスのメンバー変数として定義し、文字列”hello world”を代入して初期化する
  Foo f = new Foo("hello.txt");
  int i;

  for (i = 0; i < 3; i++) {
   f.write(word);
  }
 }
}
    • good
    • 0
この回答へのお礼

助かりました

本当に丁寧に回答してくださりありがとうございました
ここ数日わからないことだらけで、半ば諦め気味できたが、あたらめて参考にさせて頂き、再度むきあっていけそうです
感謝しています

お礼日時:2020/08/22 23:52

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


おすすめ情報