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

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

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

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

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

Q&A

解決済

2回答

321閲覧

クラス変数のコンストラクタで初期値で初期化と値をセットした初期化の違い

-._dgfe3w

総合スコア17

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

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

0グッド

0クリップ

投稿2019/02/15 14:33

Javaには
1.クラス変数のコンストラクタで初期値で初期化
2.クラス変数のコンストラクタで値をセットした初期化
の場合があるのかなとおもいますが・・・合っているでしょうか?

List<Book>と数字の型で1つ返却したいのですが
1と2どちらがいいのでしょうか?

それぞれの使われどころと用途が?です。

// ブックコレクション1
// BookCollection.java
class BookCollection {
List<Book> bookList;
int count;

// コンストラクタ public void BookCollection() { this.bookList booklist = new List<Book>(); this.count= 0; } private List<Book> getBookList() { return this.bookList; } private int getCount() { return this.count; } private setBookList(List<Book> bookList) { this.bookList = bookList; } private setCount(int count) { this.count= count; }

}

// ブックコレクション2
// BookCollection2 .java
class BookCollection2 {
List<Book> bookList;
int count;

// コンストラクタ public void BookCollection(List<Book> bookList, int count) { this.bookList = bookList; this.count= count; }

}

// メイン
public class initSample{
public static void main(String[] args) {
//メソッド呼び出し
init();
}

private BookCollection or BookCollection2 init() {
//初期値で初期化
BookCollection bookCollection = new BookCollection();
bookCollection.setBookList(new List<Book>());
bookCollection.setCount(0);

//初期値として値をセットした初期化 List<Book> bookList = new List<Book>; int count = 0; BookCollection2 bookCollection = new BookCollection(bookList, count); //戻す return bookCollection;

}
}

1のBookCollection も2のBookCollection2 も同じ中身になるのでしょうか?


Java 8

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

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

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

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

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

guest

回答2

0

1のBookCollection も2のBookCollection2 も同じ中身になるのでしょうか?

このコードで比較しているのはコンストラクタによる初期値のセットとインスタンス生成後の値のセットだと思います。
どちらも最終的な状態で言えば同じ値がセットされるので答えはYesです。

しかし上のコードのままでは意図した動作はしません。

Mainクラスで呼び出している
BookCollection.setBookList(List<Book>)
BookCollection.setCount(int)
にはアクセス修飾子privateが設定されています。
privateは外部クラスからのアクセスを許さないためpublicに変更する必要があります。

これらのset○○() や get○○()はそれぞれsetter, getterと呼ばれる物でクラスのフィールド変数にアクセスするための手段を限定する目的で使用します。
フィールド変数とは今回の場合List<Book> bookList, int countを指します。

上記のコードですとフィールド変数はどこからでも参照が可能となります。
そのためアクセス修飾子をprivateにすると堅牢な作りになります。

なにが言いたいかというと上記のコードではprivateにするべき所とpublicにするべき所が逆です。

サンプルを置いておくのでよく考えてみて下さい。
実行して確認していないので動くかどうかわかりません(たぶん動く)
インポート文などは省略したので自分でつけて下さい。

Java

1/* 2 * Book.java 3 */ 4 5class Book { 6 private string title; 7 private string author; 8 9 public Book(String title, String author) { 10 this.title = title; 11 this.author = author; 12 } 13 14 public getTitle() { 15 return this.title; 16 } 17 18 public getAuthor() { 19 return this.author; 20 } 21}

Java

1/* 2 * BookCollectionOne.java 3 * フィールド変数へのアクセスはsetter getterを使う 4 */ 5 6class BookCollectionOne { 7 private List<Book> bookList; 8 private int count; 9 10 public List<Book> getBookList() { 11 return this.bookList; 12 } 13 14 public int getCount() { 15 return this.count; 16 } 17 18 public setBookList(List<Book> bookList) { 19 this.bookList = bookList; 20 } 21 22 public setCount(int count) { 23 this.count= count; 24 } 25}

Java

1/* 2 * BookCollectionTow.java 3 * フィールド変数への初期値設定にコンストラクタを用いる 4 * フィールド変数へのアクセスはsetter getterを使う 5 */ 6 7class BookCollectionTow { 8 private List<Book> bookList; 9 private int count; 10 11 public BookCollectionTow(List<Book> bookList, int count) { 12 this.bookList = bookList; 13 this.count = count; 14 } 15 16 public List<Book> getBookList() { 17 return this.bookList; 18 } 19 20 public int getCount() { 21 return this.count; 22 } 23 24 public setBookList(List<Book> bookList) { 25 this.bookList = bookList; 26 } 27 28 public setCount(int count) { 29 this.count= count; 30 } 31}

Java

1/* 2 * Main.java 3 */ 4 5class Main { 6 public static void main(String args[]) { 7 List<Book> bookList = new ArrayList<Book>(); 8 bookList.add(new Book("タイトル", "作者"); 9 10 BookCollectionOne bookCollectionOne = new BookCollectionOne(); 11 bookCollectionOne.setBookList(bookList); // setterを使ってbookListを設定している 12 bookCollectionOne.setCount(bookList.size()); // setterを使ってbookListの要素数をcountに設定している 13 14 System.out.println(bookCollectionOne.getBookList().get(0).getTitle()); // 出力: タイトル 15 16 BookCollectionTow bookCollectionTow = new BookCollectionTow(bookList, bookList.size()); //コンストラクタを使って初期値を設定する 17 System.out.println(bookCollectionTow.getBookList().get(0).getTitle()); // 出力: タイトル 18 } 19}

投稿2019/02/15 19:55

teikoku-penguin

総合スコア314

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

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

-._dgfe3w

2019/02/19 14:34

1のBookCollection も2のBookCollection2について結果が同じであることなのはわかっていますが 用途が知りたいのです。
teikoku-penguin

2019/02/20 05:56 編集

後から設定したいか初期値として設定たいか...ですかね 特に理由がないのならコンストラクタを使えばいいと思います ちなみにですが、setterが一番多く使われるのは値の変更(アップデート)かなと思います
guest

0

ベストアンサー

「クラス変数のコンストラクタ」という表現に違和感があります. 「コンストラクタ」だけで大丈夫と思います.
Java に不馴れな方とお見受けします. count は bookList の要素数でしょうか. でしたら bookList が自分で持っていますので不要です.

コンストラクタでの初期化は, この場合は結果的には同じと思います.
BookColection の機能によりまして, 使い分けるもしくは併用することもあるかと思います.


用途ですが, 引数の有るコンストラクタは, 引数の無いコンストラクタと setter の組み合わせを1行に書ける便利バージョンと思われて良いかと思います.
不変オブジェクトと言われるものでは setter を定義しないので, 必要なデータは全てコンストラクタで指定されることになります.

コンストラクタの引数となるのはそのクラスの中心となるデータの場合が多く, それが無ければ動作出来ないとなれば, 引数の無いコンストラクタは用意せず必ず指定させるようにします.
(その場合コンストラクタ内部では本当に有効な引数なのかをチェックし, 問題があれば例外を出してオブジェクトを利用出来なくします.)

余談としましては, 一部のツールではパラメータの無いコンストラクタが必要なものがありますので, 引数として必要なデータがあるのにそのツールに対応する必要がある場合は, 色々策を練ることになります.


1.クラス変数のコンストラクタで初期値で初期化
2.クラス変数のコンストラクタで値をセットした初期化
:
List<Book>と数字の型で1つ返却したいのですが
1と2どちらがいいのでしょうか?

コンストラクタは生成の 方法 ですので, 返却( getter ) から見てどちらが"良い"ということはありません.

投稿2019/02/15 16:44

編集2019/02/19 17:17
jimbe

総合スコア12632

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

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

jimbe

2019/02/15 17:14

ですが, もし実際に使う場面があるとしましたら, ご質問と少し違う意味で, どちらのクラスもダメ出しをすることになるかと思います.
-._dgfe3w

2019/02/19 14:33

bookListとcountは別物になります。bookList.size()で件数が取得できますが今回使いません。 質問の回答がありませんが?
jimbe

2019/02/19 16:15

「それぞれの使われどころと用途が?です。」が主題だったのですね. タイトルが「クラス変数のコンストラクタで初期値で初期化と値をセットした初期化の違い」ですし, ご質問の文書が最後に「~同じ中身になるのでしょうか?」と書かれていましたので, 「結果的には同じ」という回答のみとなりました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問