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

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

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

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

Java

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

Q&A

解決済

4回答

928閲覧

staticクラスを作成すべき場面とは(メンテナンス性やメモリとの兼ね合いについて)

Dash_003

総合スコア27

Java EE

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

Java

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

0グッド

0クリップ

投稿2020/02/18 06:55

編集2020/02/18 07:23

#staticクラスを積極的に使用すべき場面とはどこなのか?
ご覧いただきありがとうございます。

いま私はデータベースにアクセスをしたりユーザーからフォームで値を受け取ったり、といった
ごくごく標準的なWEBサイト(WEBアプリ)の作成を業務で行っております。

その中で

「このメソッドって他のクラスでも使うから共通化したいな」
「このコードって他の色々なクラスで使うから共通化したいな」
「この変数って・・・」「この定数って・・・」

という事を多々感じます。

例えば
"String型の変数を引数で受け取り、数値に変換できるかどうかチェックするメソッド"
"2つ以上のクラスで使われるSQL文"
"データベースのレコードが論理削除されているかいないかを判別する0と1という数値"
などです。

私個人としては上の例で挙げた3つであればstaticクラスのstaticメソッドやstatic変数などにしてしまうべきだと感じます。
テーブル定義が変わったりした場合、複数クラスに同じSQL文を書いていたらその分だけ直さなければなりませんが、static変数として持っておけば修正する箇所がそこだけで済みますし、メソッドなんかも一見正しく動作してたがある条件を満たすとエラーになることが発覚した!なんてなったら目も当てられません。
0や1といったたった一桁の数値であっても、マジックナンバー化を防ごうと思ったら各クラス毎に定数として定義すべきですし、そうするくらいならstaticな定数として定義した方がよいと感じます。

#メンテナンス性が損なわれるという真逆の意見
そんなことを思いながらネットで調べてみたのですが、そこでびっくり。

「staticは多用するとメンテナンス性が損なわれる」

といったような内容が結構書かれていたのです。

他にも**「staticはメモリを使う」**といった意見も人から聞いたりしました。

#個人的な意見で良いのでお聞かせください
このような背景があり質問をさせていただきました。
絶対に正しい一般論は難しいと思うので、個人としての主張を聞かせてください。

私個人としては共通化できる部分はどんどん共通化すべきだと思っていますし、同じコードや同じ定数を複数のクラスに書いてしまっている方がよほどメンテナンス性に欠ける、変更に弱いと思います。

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

#追記
読んだサイトなど
ttps://ryoasai.hatenadiary.org/entry/20110702/1309600182

ttps://anopara.net/2014/04/11/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E4%B8%AD%E7%B4%9A%E8%80%85%E3%81%AB%E8%AA%AD%E3%82%93%E3%81%A7%E3%81%BB%E3%81%97%E3%81%84%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89/

ttps://qiita.com/ue_knnk/items/fa84b8bc30ba319e5744

メモリについては先輩から受けた話です。(Javaの事を言ったのかどうかはわかりません><)

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

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

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

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

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

nskydiving

2020/02/18 07:12

>「staticは多用するとメンテナンス性が損なわれる」 >「staticはメモリを使う」 こちらの理由、または出典を追記していただくことはできますでしょうか?
Dash_003

2020/02/18 07:23

追記しました
Zuishin

2020/02/18 07:44

ttps という未知のプロトコルではなくマークダウンを使ってください。
guest

回答4

0

ベストアンサー

個人としての主張

staticは多用するとメンテナンス性が損なわれる

static キーワードを使うとインスタンス化や継承・インターフェイスなど、オブジェクト指向の機能がもろもろ使えなくなります。

オブジェクト指向言語において、メンテナンスがしやすくなるためにはポリモーフィズムが欠かせません。そのことを言っているのだと思います。

詳しくはポリモーフィズムを理解する必要があります。

「staticはメモリを使う」

ではないでしょうか。

通常のオブジェクトはインスタンス毎に1つ、static オブジェクトはクラス毎に1つしか存在しないので、後者の方がメモリサイズが小さいでしょう。

ですが、メモリの節約のために static を使うのは悪手 と思います。

上の例で挙げた3つであればstaticクラスのstaticメソッドやstatic変数などにしてしまうべき

static にするべきかどうかは staticクラス、staticメソッドの意味と利点 を参照してください。

テーブル定義が変わったりした場合、複数クラスに同じSQL文を書いていたらその分だけ直さなければなりませんが、static変数として持っておけば修正する箇所がそこだけで済みます

詳しい実装は分かりませんが、ベースクラスを用意してそこに同じSQL文とやらを書けば必要なさそうですね。(あくまで勘)

0や1といったたった一桁の数値であっても、マジックナンバー化を防ごうと思ったら各クラス毎に定数として定義すべきですし、そうするくらいならstaticな定数として定義した方がよいと感じます

基本は Enum が好みですね。

staticクラスを積極的に使用すべき場面とはどこなのか?

そもそも static キーワード自体、シングルトンパターンの実装や引数にしか依存しない関数を定義したい時ぐらいしか私は使いません。

そして、引数にしか依存しない関数のみを定義するクラス は static で良いでしょう。逆に言えばそれ以外は駄目です。

投稿2020/02/18 08:40

編集2020/02/18 09:05
BluOxy

総合スコア2663

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

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

BluOxy

2020/02/18 08:53

ちなみに、私は Java に詳しくありません。
Dash_003

2020/02/18 09:10

回答ありがとうございます。 ポリモーフィズム、Enumクラスというものを知らなかったのでとてもためになりました。 staticではなくベースクラスなどを作りそれを継承するというやり方は思ってもみなかったですがやりたいことが実現できそうだと感じました。 また色々考えて方法を探ってみたいと思います。ありがとうございました。
guest

0

まぁ単にstaticの理解が足りないだけなのでもっと学習が進んでから考えたほうが良い。
ネットに書いてあることも正しく読めてない。

staticメソッドはテストしにくいという現代では致命的なデメリットがある。
長い歴史の中でどこでstaticメソッドを使うべきかはもう大体決まってるので
初心者の思い付きのほうが正しいなんてことはありえない。

投稿2020/02/18 07:41

kawax

総合スコア10377

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

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

Dash_003

2020/02/18 07:54

Javaは詳しいですか?
Zuishin

2020/02/18 07:57

> 個人的な意見で良いのでお聞かせください という質問のはずです。回答者に資格が必要なら追記してください。
Dash_003

2020/02/18 07:59

回答者のプロフィールに登録されているタグにJavaが含まれておらず、Javaにおけるstaticについての見解なのかわからなかったため質問をしました。 特に明示はしておりませんでしたが、タグにJavaをつけてるのでJavaにおけるstaticについて回答を募集しています。
Zuishin

2020/02/18 08:06

この質問は、Java の static に関する質問ではなく、インスタンスを使わないメソッドについての質問と読み取れます。だとしたら Java にそれほど詳しくなくとも回答可能です。違うなら質問が不明瞭なので編集してください。
Dash_003

2020/02/18 08:20

「タグと質問タイトル」で質問内容を定義していると思いますが。 タグで質問内容(使用言語)を定義、特定できないのであればタグは何に使用するんですか?
Zuishin

2020/02/18 08:23

同じ言葉を繰り返した方がいいですか?
Dash_003

2020/02/18 08:38

// フィールド変数 boolean isAnswer; public void MyAnswer() { this.isAnswer = true; while(this.isAnswer) { if (タグの意味についての回答がある) { this.isAnswer = false; } else { system.out.println("タグで質問内容(使用言語)を定義、特定できないのであればタグは何に使用するんですか?"); } }
Zuishin

2020/02/18 08:40

タグの使用法が知りたいなら新しく質問してください。
Zuishin

2020/02/18 08:40

私は「質問が不明瞭だ」とこう言っています。
Zuishin

2020/02/18 08:43

Java 独自の仕様に踏み込むほど深みが必要には見えません。
Dash_003

2020/02/18 09:17

プログラマなら個人の感覚で話をするのではなく、与えられている確実な情報のみを根拠に物事を理解したほうがいいと思います。 少なくともJavaについての質問だという事がわからないようであれば、普段仕様書などを読むのも困難ではないですか? ま、一緒に頑張りましょうね。
Zuishin

2020/02/18 09:24

Java に詳しくなくてもベストアンサー取れる質問でしたね。難しいことを言いました。頑張ってください。
guest

0

「staticは多用するとメンテナンス性が損なわれる」

出典の記事にも「多用」とありますが、正しくは「乱用」ではないかと思います。
static は適切に使用すれば、何の問題もありません。

Javaのstaticメソッドの場合、適切な場面は

・状態を持たず、同じ呼び出しに同じ値を返すような関数(例: Math.sin)
・オブジェクトを作成するメソッド(例: String.valueOf)
・インスタンスの状態に紐付かない、外部公開しないような補助メソッド
・多様なオブジェクトに使えるユーティリティ関数(例: Objects.equals)

引用元:Java - Java Staticの多様化がいけない理由・デメリット|teratail
https://teratail.com/questions/203779

他にも「staticはメモリを使う」といった意見も人から聞いたりしました。

メモリについては先輩から受けた話です。(Javaの事を言ったのかどうかはわかりません><)

それでは回答できませんので、その先輩に聞いてください。

投稿2020/02/18 08:23

nskydiving

総合スコア6500

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

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

Dash_003

2020/02/18 09:12

先輩はRubyなどがメインだったみたいで、Javaについてはそこまで詳しく無かったようです。お騒がせしました。 適切に利用するなら良いみたいなので、その線引きについては色々調べて理解していこうと思います。 ありがとうございました。
guest

0

直接staticとは関係が無いのですが、共通化にご興味があればお聞き下さい。

”staticではなくベースクラスなどを作りそれを継承するというやり方”でももちろん共通化はできますが、継承だけではありません。

それは”Interface”です。

継承に比べ、その機能が分かりづらい感も持たれがちですが、インターフェースを理解すると間違いなく共通化が”ずっと”楽しくなります。

Java標準APIにはたくさんインターフェースがありますが、これらはほぼ共通化のために用意されている、と考えても過言ではないと思います。例えば Collections.sort(List<T>, Comparator<? super T>) はソートのロジックを知らなくても Comparator インターフェースの大小比較の実装だけで様々なクラスの並び替えが実現できます。これはソート処理において、共通側が分からない大小比較のみを呼び出し側に教えてもらい(Comparatorの実装)、それ以外は共通側で処理します。このように一部を呼び出し側の実装に委ねることで実現できる共通化の手法をマスターすれば、これまでできなかった共通化も可能になります。

加えて、この考え方を発展させればフレームワークの作成も可能になります。フレームワークは簡単に説明すると”処理の流れの共通化”です。Webアプリのフレームワークを利用した経験があれば、ネットワーク関連の処理を書かなくてもサーバー⇔クライアント間通信処理ができていることに不思議に思ったかもしれません(当たり前すぎて逆に思わないかも…)。これはSubmitボタンが押されてからサーバー側でデータを受信してからクライアント側へ送信するまでの処理が共通化されているからに他なりません。クライアント側に表示する具体的なページの内容は共通側には分からないので、その部分を開発者に委ねているだけです。基本的な考え方は上記の並び替えの処理と変わりありません。

もっと事例を挙げたいのですが、詳しくは 「先輩、Javaのインターフェースって何ですか?」の答えに窮した時に読む本を読んでみてください。私自身、結構役立ったのでお勧めします。電子書籍版はタブレット端末のように大きい画面でないと辛いと思いますので、ご注意を。ではっ!

投稿2020/02/18 11:55

Mirko_Mug_Cup

総合スコア53

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

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

Dash_003

2020/02/18 13:44

回答ありがとうございます。 インターフェース、何となく難しそうという良くない理由で詳しく学ばずにいましたがこれを機に調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問