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

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

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

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

Q&A

2回答

6359閲覧

内部クラスをいっぱい持つのよくない?

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2017/11/23 12:27

クラスの下に内部クラスをいっぱい作って…

public class MainClass { private String aaa; private String bbb; private SubClsA clsa; private SubClsB clsb; public void setAaa(String aaa) { this.aaa = aaa; } public String getAaa() { return this.aaa; } public void setBbb(String bbb) { this.bbb= bbb; } public String getBbb() { return this.bbb; } public void setClsA(String subaa, String subab) { clsa = new SubClsA(); clsa.setSubaa(subaa); clsa.setSubab(subab); } public SubClsA getClsA() { return this.clsa; } class SubClsA { private String subaa; private String subab; ・・・ } class SubClsB { private String subba; private String subbb; ・・・ } }
test = new MainClass (); test.setAaa("test"); test.setClsA("testA","testB"); ・・・

setClsAを呼ぶときに、内部でnewしてインスタンス保持して~
という作り方って、メモリ的にどうなんでしょう?

keyに紐づくデータ群で1つのJSONを作成して、それがkeyの数分出力するバッチです。
1つのJSON出力後にtest=nullとか突っ込んどけば問題なさそうでしょうか?

補足:
なんでこんなつくりするかというと
jacksonライブラリでJSON出力するのですが階層構造にしたかったので…

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

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

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

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

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

guest

回答2

0

以下、クラスが自由に作れる状況を前提にお話します。
(課題や規約で、自由にクラスが作れない場合は別の話)

内部クラスを用いるのは、その外部(エンクロージング)クラスでしか使わないとき
というシンプルなルールを私は考えています。要するに専用クラスです。


しかし、実際には個人的に、内部クラスを、あまり多用しません
なぜかというと、クラスを細かく分割して、直交性を上げていくのが、
Java流のオブジェクト指向(小クラス主義)だと思うからです。

このクラスは専用でいいだろう、と当初思っていても、
後でふり返ると、共通化できたりする場合が、意外とよくあります。
(もちろん、共通化がつねに正しいとは限りません)

どんな処理が共通化できるかは、コード全体から見えてくるので、
多くの場合で、最初から内部クラスで作るより、
後から内部化する方が無難だと感じます。


内部クラスを避ける理由をもう少し述べてみます。

たとえば、何でもStaticにすると、気分はStaticになるかもしれませんが、
状態を持ったインスタンスを生成する、というOOPの基本から外れますよね。

同様に、何でも内部クラスにすると、クラスを組み合わせて重複を排除していく、
というOOPの基本から外れていってしまうように思います。

さらに言うと、内部クラスは継承に似ていて、基本的に密結合なので、
使い所がないわけでもないが、そこそこ難しいように感じています。

サンプルコードもはスッキリしてますが、後で本格的な処理をしたときに、
それぞれの内部クラスのコード量が10倍などとなると、肥大化してしまいます。

もしかして、「後で必要になってから、バラせばいいでしょ」と思うかもしれませんが、
じゃあ継承だって、後でバラせばいいかというと、やはり大変なので、
だから「継承より委譲」みたいに言われるわけです。それにどこか似ていると思います。

ただし、Static不要だとも、継承不要だとも思わないので、
内部クラス不要だとも思いません。使うべきときは使って良いと思います。

投稿2017/11/23 13:05

編集2017/11/23 13:13
LLman

総合スコア5592

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

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

0

階層構造であれば、Compositeパターン等で代替できないかは検討できるかと思います。
内部クラスは、クラスの定義内容が増えるものと考えられるので、本当に内部的に使用するクラスにのみ用いた方がよいかと思います。

投稿2017/11/23 12:32

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問