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

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

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

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

Q&A

解決済

3回答

4317閲覧

3つ以上の同じ処理内容を含むコンストラクタの利用方法

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2017/11/16 06:47

複数のコンストラクタの内容に重複部分がある場合、コンストラクタからコンストラクタを呼び出せば手間が省けるというの学んだのですが

(例)

public class Main { public static void main(String[] args) { Hero h1 = new Hero("タナカ"); Hero h2 = new Hero(); System.out.println(h1.hp); System.out.println(h1.name); System.out.println(h2.hp); System.out.println(h2.name); } }
public class Hero { String name; int hp; Hero(String name) { this.hp = 100; this.name = name; } Hero() { this("スズキ"); } }

実行結果

100 タナカ 100 スズキ

もう一つ(3つ以上)インスタンスを生成して、同じ内容のコンストラクタ(hpは同じで名前はまた個別に与える)を利用したい場合どうしたらいいですか?

同じように

public class Main { public static void main(String[] args) { Hero h1 = new Hero("ミナト"); Hero h2 = new Hero(); Hero h3 = new Hero(); System.out.println(h1.hp); System.out.println(h1.name); System.out.println(h2.hp); System.out.println(h2.name); System.out.println(h3.name); } }
public class Hero { String name; int hp; Hero(String name) { this.hp = 100; this.name = name; } Hero() { this("スガワラ"); } Hero() { this("ヤマダ"); } }

と書こうと思ったのですが、”メソッド名が重複しています” とエラーメッセージが出ます。
でもメソッド名とクラス名が同じでないとコンストラクタと見なされないし、どうすれば良いのでしょうか?

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

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

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

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

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

guest

回答3

0

結論から言うと、次のようなコンストラクタは書くべきではありません。

Java

1public class Hero { 2 ...
Hero() { this("スズキ"); }

}

引数のないコンストラクタはこの場合デフォルトの動作をすべきで、具体性を伴ってはいけません。
『知らないヒーローを見たらスズキだと思え』みたいなイメージになってしまっています。

次のようなコンストラクタなら、まだ許容範囲ではあります。

Java

1public class Hero { 2 ... 3 4 Hero() { 5 this("unknown"); 6 } 7}

サンプル

ついでに、アクセッサという重要な要素も取り入れています。

Java

1public class Main { 2 public static void main(String[] args) { 3 Hero h1 = new Hero("ミナト"); 4 Hero h2 = new Hero("スガワラ"); 5 Hero h3 = new Hero("ヤマダ"); 6 7 System.out.println(h1.getHp()); 8 System.out.println(h1.getName()); 9 10 System.out.println(h2.getHp()); 11 System.out.println(h2.getName()); 12 13 System.out.println(h3.getHp()); 14 System.out.println(h3.getName()); 15 } 16} 17 18class Hero { 19 private final String name; 20 private int hp; 21 22 Hero(String name) { 23 this.hp = 100; 24 this.name = name; 25 } 26 27 String getName() { 28 return name; 29 } 30 int getHp() { 31 return hp; 32 } 33}

このコードもまだ改良可能です。
配列やリストなどの学習を終えたら、ちょっと考えてみてください。

投稿2017/11/16 06:54

編集2017/11/16 07:06
LouiS0616

総合スコア35660

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

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

退会済みユーザー

退会済みユーザー

2017/11/20 08:05

そうなんですね。コンストラクタがどういう動作をするものなのかというのを学んだばかりなので、あまり質の事はよくわかっていないので参考になります。ありがとうございました。
guest

0

ベストアンサー

ご質問を見て違和感を感じたのは、まず、
変数の値が異なるだけなら、引数を変えれば良いということです。

Javaのコンストラクタはオーバーロードできますが、
オーバーロードするには引数の型か個数が異なる必要があります。
が、これで十分なのです。具体的な値は引数で変えれば良いからです。

上手くできた仕組みです。ご質問のサンプルコードのように、
具体的な値が異なるたびに、コンストラクタを作っていては、
キリがありませんので、まずしません。そもそも、やる必要がないのです。

ただ、やろうとしている延長線上の書き方は思いつくので、一応紹介します。
言葉だけで説明すると分かりにくいので、具体的なコードを示します。
以下、すごく長くなってしまいましたが、コード自体はシンプルです。


java

1public class Main { 2 public static void main(String[] args) { 3 4 Hero h1 = new Hero(); 5 Hero h2 = new Hero("スズキ"); 6 Hero h3 = new Hero("タナカ", 200); 7 8 System.out.println(h1.name); 9 System.out.println(h1.hp); 10 11 System.out.println(h2.name); 12 System.out.println(h2.hp); 13 14 System.out.println(h3.name); 15 System.out.println(h3.hp); 16 } 17}

java

1public class Hero { 2 String name; 3 int hp; 4 5 Hero() { 6 this.hp = 0; 7 this.name = "Anonymous"; 8 } 9 Hero(String name) { 10 this.hp = 0; 11 this.name = name; 12 } 13 Hero(String name, int hp) { 14 this.hp = hp; 15 this.name = name; 16 } 17}

java

1public class Hero { 2 String name; 3 int hp; 4 5 Hero() { 6 this("Anonymous", 0); 7 } 8 Hero(String name) { 9 this(name, 0); 10 } 11 Hero(String name, int hp) { 12 this.hp = hp; 13 this.name = name; 14 } 15}

java

1public class Hero { 2 String name; 3 int hp; 4 5 Hero() { 6 this("Anonymous"); 7 } 8 Hero(String name) { 9 this(name, 0); 10 } 11 Hero(String name, int hp) { 12 this.hp = hp; 13 this.name = name; 14 } 15}
// 動作結果 Anonymous 0 スズキ 0 タナカ 200

まず、Mainクラスは、ご質問のサンプルコードを
説明の便宜上、少しだけ改変しました。

それから、Heroクラスの書き方を3つ示しましたが、
これらを交換しても、同じ最後の動作結果になります。

上のコードは何かというと、デフォルト値を設定する書き方です。
たとえば、RPGなら(クラス名はそのイメージでしょう)、
NPCがたくさんいて、街を歩いてるけど、名前も戦闘も関係ない、
そういう場合に省略できる書き方です。

3つのHeroクラスは、コンストラクタのオーバーロードを利用していて、
最初のものは単純に別々に初期化しています。
2つめは、別のコンストラクタを呼び出しており、
3つめは、連鎖的にコンストラクタを呼び出しています。

後の方ほど短くなります。サンプルでは大差ないように感じるでしょうが、
設定する変数や引数が多くなると、もっと違いが出てきます。
ただし、その一方で記述が複雑になりやすいデメリットもあります。

実際に使うかどうかは別にして、こういう書き方があるということです。


さてここまで、なるべくご質問のやりたいことに沿って、
私の価値観を押しつけないようにしましたが、
私自身はこういうコンストラクタを多用しません。

もし、インスタンスの生成が複雑になれば、
たとえば、ファクトリやビルダー、
デコレータなどの利用を検討します。

そもそも、引数なしのコンストラクタより、
完全コンストラクタの方が良いと思っています。
また、スモールオブジェクトにするので、
コンストラクタがやたら複雑化することもあまりないです。

これらを逐一説明すると長くなるので省略しますが、
デザインパターンなどを学習すると分かってきます。

投稿2017/11/16 12:05

LLman

総合スコア5592

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

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

退会済みユーザー

退会済みユーザー

2017/11/20 07:53

すごくわかりやすかったです。ありがとうございます。まだまだ入門教本をノソノソやっているので、これから色んなやり方を学んでいこうと思います。ありがとうございました。
guest

0

コンストラクタをそのままに、引数を変えればいいだけです。

java

1public class Main { 2 public static void main(String[] args) { 3 Hero h1 = new Hero("ミナト"); 4 Hero h2 = new Hero("スガワラ"); 5 Hero h3 = new Hero(); 6 System.out.println(h1.hp); 7 System.out.println(h1.name); 8 9 System.out.println(h2.hp); 10 System.out.println(h2.name); 11 System.out.println(h3.name); 12 } 13}

もっとも、引数なしのコンストラクタで具体名を持っているのがあまり褒められたものではないのはLouiS0616さんのご指摘のとおりです。

投稿2017/11/16 07:09

swordone

総合スコア20651

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

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

退会済みユーザー

退会済みユーザー

2017/11/20 08:01

単純に考えればその通りでしたね・・・実際に書き込んでみるとより一層感じました。 お恥ずかしい。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問