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

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

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

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

2回答

894閲覧

staticの使い方が適切か知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

1クリップ

投稿2020/09/07 11:13

編集2020/09/07 12:49

色々なサイトにstaticの乱用に気をつけるよう書いてあるのですが、
以下の方針はstaticの使い方として合っていますか?

①java.lang.Mathのように、いくつかの引数から一つの数字を返すだけで中に変数を持たないクラスなので、毎回インスタンス化しなくても呼び出せるようにするためにstaticを付ける

②よく参照されるであろうインスタンスは、staticなクラスを作ってその中でインスタンス化する。こうすることにより、インスタンスの中の変数を確認するときにいちいちそのインスタンスを渡さなくても、forReferenceClass.getter(dataNum)のように書けばどこでも使うことができる

①、②の質問をよろしくお願いします


正しい正しくない、だと曖昧すぎでしたね。
・オブジェクト指向 を実現できているか
・この実装方法で後々に不具合が出る可能性はあるか、あるならどのような場合か
の2点から答えて欲しいです

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

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

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

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

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

gentaro

2020/09/07 12:13 編集

「正しい」の定義を教えて下さい。 エラーが発生していないコードについて、普遍的に解釈可能な「正しさ」とは仕様通り動作するか否かでしかありませんが、この解釈であれば質問内容が意味不明で、テストを通ってれば正しい、という回答ぐらいしかできません。 どのような前提条件の元「正しい」のかをちゃんと質問文に書いてないと回答不能な質問です。
guest

回答2

0

オブジェクト指向の特徴・Java のパラダイムについて簡単に触れ、①②がオブジェクト指向を実現できていないことを示し、結論としてオブジェクト指向のみに執着しないことを勧めます。

オブジェクト指向の特徴

手続き型プログラミング - Wikipedia

上にリンクしたものは、手続き型プログラミングに比較してオブジェクト指向プログラミングがどのような特徴を持っているかを書いたものです。
どこからでもアクセスできるグローバル変数の問題を解決するための、クラスによるカプセル化が示されており、また多態性による手続きの抽象化も示されています。

Java のパラダイム

Java - Wikipedia

次にリンクしたものは、Java について書かれたものです。「パラダイム」を見ると、

オブジェクト指向, コンポーネントベース, ジェネリック, 関数型, 命令型プログラミング

と、複数のパラダイムが並んでいます。つまり Java はオブジェクト指向言語ではなく、オブジェクト指向パラダイムの含まれたマルチパラダイム言語 と呼ぶことができます。
このことから言えるのはオブジェクト指向プログラミングが必ずしも Java プログラミングとして適切とは限らないということになります。

さて問題の①②ですが、これはオブジェクト指向的とは言えません。しかし先ほど述べたように、Java は純粋なオブジェクト指向言語ではないので、それがすなわち悪であるということでもありません

なぜ①②がオブジェクト指向的ではないのか

① static メソッドは多態性を持ちません。オブジェクトの状態を変化させるメソッドでもありません。それは手続型の関数です。

② static メソッドによって提供されるオブジェクトは、確かにそれを提供するクラスに縛られています。しかしそれはモジュール化と何ら変わりはないものであり、多用することによってグローバル変数と同じ問題が発生します。オブジェクト指向の本質は、様々なデータを様々な関数で扱うことではなく、カプセル化されたデータを制限された関数で扱うことであり、その思想から反しています。

結論

Java は複数のパラダイムに対応しており、問題解決のために選択することができます。問題解決に最も適した方法、そしてプログラムの保守性を高める工夫をすべきでしょう

static をいつ使うか、それはオブジェクト指向より手続き型の方が適していると考えられる時です。ですから、「オブジェクト指向を実現できているか」という問いそのものが問題の本質からずれています。「オブジェクト指向」ではなく、「問題解決」に視点を向けましょう。

しかしながら、初心者にとってオブジェクト指向は難しく、手続き型の方が理解しやすく使いやすいものです。そうすると、すべてを手続き型で解決しようとする、いわゆる satatic おじさんになりかねません。最初のうちは、まずオブジェクト指向の考え方に慣れ、オブジェクトを指向し、その上でどうしても無理がある時に static を使うくらいで良いのかもしれません。

質問への明確な回答

・オブジェクト指向 を実現できているか

別のパラダイムです。

・この実装方法で後々に不具合が出る可能性はあるか、あるならどのような場合か

場合によりますが、この判断基準で機械的に行うのであれば、後々保守が難しくなる可能性があります。本当にそれが適切なのかを個々のケースに基づいて判断する必要があります。

投稿2020/09/08 03:16

編集2020/09/08 03:51
Zuishin

総合スコア28660

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

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

0

こういう過去の質問への回答等を参考にして、あなたのプログラムにおいて「適切な」(設計意図に沿った)使い方をしているのかどうかを判断されてはどうでしょうか。

staticクラス、staticメソッドの意味と利点

投稿2020/09/07 13:39

編集2020/09/07 13:40
gentaro

総合スコア8949

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

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

dameo

2020/09/07 23:37

回答には誠意を持って答えましょう ①も②も答えていません
Zuishin

2020/09/07 23:53

①②はどちらもケースバイケースで、主題となるオブジェクト指向とは無関係なので、その判断基準を示すだけで、特に答えなくても良さそうな気がしますが。 ①参照透過な関数は static をつける(私的翻訳) 基本的にはそうですが、ポリモーフィズムを考えるとそうとは限りません。インスタンスメソッドにすべき場合もあります。 ②よく参照される値はいつでも参照できるよう static メソッドでアクセスできるようにする(私的翻訳) やりすぎるとグローバル変数と変わらなくなります。なるべくそのような手法は避けるべきですが、必要に迫られる場合もあります。
gentaro

2020/09/08 01:13

> 回答には誠意を持って答えましょう どこに「誠意」が欠けてると思ったのか提示して。 staticの意義を理解すれば質問者にとって「正しい」とか「適切か」とか判断して使えるようになるんだから、めちゃくちゃ誠意ある回答だと思ってるけど。 質問者が指定した形式で回答しなきゃいけない理由は何?質問者は神なの? むしろ質問者の理解を深める手伝いをしてると思わない?
dameo

2020/09/08 01:22

> どこに「誠意」が欠けてると思ったのか提示して。 書いたとおり、「①も②も答えていません」なので。 自分で回答不能だと思っている質問に、質問者の求めている回答になっていない回答をしている点です。 すみませんが、あなたと議論するほどの話ではなく、火を見るより明らかな話なので①②に答えてもらえませんか?
gentaro

2020/09/08 02:08

イチャモンおじさんか。話にならないわ。 火を見るより明らかなら、なんで高評価が2件付いてるのか説明してくれ。
gentaro

2020/09/08 02:12

こちらの趣旨は「魚を与えるより魚の釣り方を教える」なので、そもそも魚を与えないのが誠意がない、とか言われてもな。 そもそもこっちはちゃんと回答書いてるのに、回答書きもせずに他人の回答にイチャモンつけるだけのあんたよりよっぽど誠意があると思わんのかね。
dameo

2020/09/08 02:32

煽るだけで、ご回答頂けないんですね。私はマイナス評価の理由を記述したに過ぎません。 反論できないなら①②に答えてもらえませんか?私は分かりきった議論をするほど暇ではありません。
swordone

2020/09/08 03:40

そもそも①も②も質問じゃない件
gentaro

2020/09/08 04:28

煽るだけも何も、あなたの行動がイチャモンだと思ってるのに答えるわけないじゃん。なんで相手してもらえると思ったの?自己評価高すぎでしょ。
gentaro

2020/09/08 04:36

てか「誠意」云々言うならお前が回答しろ で終わりなんだよ。なんでそれぐらいできないの?知識ないから?
dameo

2020/09/08 04:39

理由付き低評価をイチャモンと決めつけ、反論もなしに煽り返すのがあなたの人間性なんですね
gentaro

2020/09/08 04:55

あなた以外低評価してないし、むしろ高評価が多いんだから、自分がズレてる事ぐらい気づこうや。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問