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

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

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

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

Q&A

解決済

2回答

5058閲覧

Beansクラスを継承・拡張してよいのかどうか(extendsの使い方)

Dash_003

総合スコア27

Java

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

0グッド

0クリップ

投稿2020/02/17 06:40

編集2020/02/17 07:00

##JavaのBeanクラスについて分からないことがあるので質問させていただきます。

普段データベースのデータを扱う際には、目安として「1テーブル1Beans」という形で作成しております。

(例)

Employeeテーブル に対して Employee.java

Departmentテーブル に対して Department.java
Salaryテーブル に対して Salary.java

ただ、必ずしも一度に取得したいデータが1テーブル分のものとは限らず、複数のテーブルを結合して取得することが多いと思います。
そうなると1つのBeansクラスのインスタンス変数だけでは値を格納しきれなくなります。
また、データベースから取得した情報だけではなくユーザーがフォームに入力した情報を受け取り、それも同じBeanクラスに持たせたい、といった場面もあります。(本来はDBから取得した情報を保持するクラスとフォームから受け取った情報を保持するクラスは分けるべきでしょうが。)

その際、
「テーブルに対応するBeanは必ず作成する」
「インスタンス変数を追記することはできない(新しいクラスを作成する事は可能)」
という条件があるとしたら皆様どのように対応されますか?

私個人としては2つ考えがありまして、1つは「クラス型のインスタンス変数を持つ新しいクラスを作成する」です。

[Employee2.java] public class Employee2 { // Employeeクラス型のインスタンス変数 Employee emp; // Employeeクラスでは定義されていない追加したい情報 String str; int num; }

ただこれだとどのみち2つ分のクラスをインスタンス化しますし、データへのアクセスの仕方が少々めんどうだなと感じてしまいます。

もう一つの方法が試したことはありませんが質問にも記載した、「Beansクラスを拡張し新しいクラスを作成する」です。

[EmployeeAndMore.java] public class EmployeeAndMore extends Employee { // Employeeクラスでは定義されていない追加したい情報 String str; int num; }

こちらだとインスタンス化するクラスは一つで済みますし、データへのアクセスも容易に感じます。
ただ自分の経験上このような「Beansクラスを拡張したクラス」を見たことが無かったので、そもそも拡張(extends)の使い方として正しいのか含め疑問に思い質問させていただきました。

よろしくお願いいたします。

#追記
業務内容なので詳しく触れられない&私の頭で別の例に置き換える能力が無くわかりにくい質問になってしまってます、すいません。

この質問をした背景が、
・「1つのテーブルから必ず1レコードだけを取得するSQLが存在する」
・「view側で表示させるロジックの都合上、1つだけのクラスインスタンスをリストに格納したい」
・「既存のBeansクラスだけではview側で必要になる値を網羅しきれない」
・「DBから取得した情報プラスアルファを保持できるクラスを作成&インスタンス化し、それをリストに格納して渡したい」
という事があったからです。

必ずview側で展開するための情報をすべて保持したクラスを作らなければいけない場合、どうするのが正しいのかなと思い質問をしました。

#追記2
申し訳ありません。拡張と書いておりましたが、伝えたいニュアンスとしてはBeansクラスを継承したクラスを作ってもよいのか?です。
Beansクラスを拡張も視点が違うだけで間違いではないと思いますが、念のため。

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

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

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

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

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

guest

回答2

0

ベストアンサー

別々に作った方がお互いの依存度が薄くなるので、データベース側のBeanと画面用のBeanは分けます。
(どちらかがもう一方を継承してしまうとなると、両方変更が発生してしまうのを忌避しています。)

テーブルに登録されている内容のBeanをそのまま画面に出力する場合として、画面側に渡す処理はたいていデータベースからの値の写像ばかりであり、かつ画面へ渡すための実装量があまりに多く、変更頻度もたくさんあるとなった場合は、質問に記載していただいた1番目の手法を選択し、画面側にて簡単に切り替えができるようにする選択もあります。

投稿2020/02/17 07:29

A-pZ

総合スコア12011

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

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

0

もうちょっと具体例欲しいですが各テーブルやデータ構造の親子関係によるのでは。

「子だけとりたい」ということも必ずあるでしょうし。

役割分担の観点からすると要件の違うデータを同じクラスに持つのはメンテナンス性もよろしくないですし、関係性も損なうと思います。

投稿2020/02/17 06:45

m.ts10806

総合スコア80875

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

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

Dash_003

2020/02/17 06:52

業務内容なので詳しく触れられない&私の頭で別の例に置き換える能力が無くわかりにくい質問になってしまってます、すいません。 この質問をした背景が、 ・「1つのテーブルから必ず1レコードだけを取得するSQLが存在する」 ・「view側で表示させるロジックの都合上、1つだけのクラスインスタンスをリストに格納したい」 ・「既存のBeansクラスだけではview側で必要になる値を網羅しきれない」 ・「DBから取得した情報プラスアルファを保持できるクラスを作成&インスタンス化し、それをリストに格納して渡したい」 という事があったからなんです。 必ずview側で展開するための情報をすべて保持したクラスを作らなければいけない場合、どうするのが正しいのかなと思い質問をしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問