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

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

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

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

Q&A

解決済

4回答

2126閲覧

Javaのオーバーロードの使い方について

yamaki

総合スコア19

Java

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

0グッド

1クリップ

投稿2020/02/14 09:00

Javaのオーバーロードの使い方についての質問です。

オーバーロードさせたメソッドを変換処理のように使用しています。
これをみて、わざわざオーバーロードさせなくても、引数にNULLを追加すればいいのではないか、
と思いました。

皆さんはどのように思いますか。

以下の例のように、オーバーロード2メソッドを呼び出す際の変換処理に、
オーバーロード1メソッドが用意されています。

java

1 public void testController(){ 2 // オーバーロードのメソッドを呼び出す 3 if(dataTimeCheck(sDate, holiday)) { 4 } 5 } 6 7 // オーバーロード1 8 public boolean dateTimeCheck(Date sDate, String hodiday){ 9 return dateTimeCheck(sDate, null, hodiday) 10 } 11 12 // オーバーロード2 13 public boolean dateTimeCheck(Date sDate, String baseDate, String hodiday){ 14 // 日付判定処理 15 } 16

私としては上記の「if(dataTimeCheck(sDate, holiday))」部分を
「if(dataTimeCheck(sDate, null, holiday))」のようにしてしまった方がいいと思います。

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

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

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

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

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

stdio

2020/02/14 09:12

え... まぁ...やりたければ好きにすれば... しかしJavaにはC++のような**デフォルト引数**の機能がありません。 その為、可読性を重視するという目的で、関数をオーバーロードを実装するのが一般的です。
dodox86

2020/02/14 09:13

dataTimeCheckのオーバーロード版の実装が質問中に示されていないので、他人では評価のしようが無い気がしますがどうでしょうか。尚、今のコードで思うのは、dateTimeCheckと言うメソッド名では「何をチェックするの?」と言う疑問が出ます。有効か無効か、であれば、isDateTimeValid() とか。
m.ts10806

2020/02/14 09:30

使われ方、仕様、要件次第なので、これだけではなんとも言えませんよ。
dodox86

2020/02/14 09:51

> オーバーロード版の実装が質問中に示されていない 大変失礼しました。これは、示されていましたね。
Zuishin

2020/02/15 01:01

baseDate を null で呼び出すことが多いなら、そのたびにわざわざ null を入れるのは無駄ではありませんか? プログラミングするときは、基本的に呼び出される側のコードを少なくするのではなく、呼び出す側のコードが少なくなるように書きます。その方がプログラマーの読み書きの負担が少なくなります。
guest

回答4

0

このコードが単に"オーバーロードの例としてのコード"という可能性はないでしょうか。

例えば、メソッドとはなにか? の説明として

java

1public int add(int a, int b) { 2 return a + b; 3}

というコードを見せられた時に~~「a+bでいいですよね? メソッドって意味あります?」という感想を言っているようなものかと思います~~。

追記

ここは取り消します。よく考えたらこの質問は"オーバーロードの有用性"に関する質問じゃありませんね。
例としてのコードであるなら中身の有用性であれこれ言っても仕方ないでしょう、程度の表現でよかったですね。失礼しました。

追記終わり


そうでないとすると、勝手な想定として、

java

1 // オーバーロード1 2 public boolean dateTimeCheck(Date sDate, String hodiday){ 3 return dateTimeCheck(sDate, null, hodiday) 4 } 5 6 // オーバーロード2 7 public boolean dateTimeCheck(Date sDate, String baseDate, String hodiday){ 8 // 日付判定処理 9 if (baseDate == null) { 10 baseDate = なんか初期値; 11 } 12 処理続く 13 }

みたいな実装だとしましょう。

もうひとつ

java

1 // オーバーロード1 2 public boolean dateTimeCheck(Date sDate, String hodiday){ 3 // 日付判定処理1 4 } 5 6 // オーバーロード2 7 public boolean dateTimeCheck(Date sDate, String baseDate, String hodiday){ 8 // 日付判定処理2 9 }

というような実装を考えましょう。
この2つは同じじゃありません

上の実装だとdataTimeCheck(sDate, null, holiday)と呼び出しても 第2引数のnullに対してNullPointerException がでる余地がありませんが、下の実装だと NullPointerException がでる可能性があります。

というか、呼び出し方が不適切だった時には NullPointerException のエラーで正しく異常停止する実装の方がより安全です。

dataTimeCheck(sDate, null, holiday)でもいいという判断には、不適切なことをしたら正しく停止する方が安全、という発想がありませんね。


ダメな実装例を見ていて「これじゃ意味なくない?」と正しく判断している可能性もあって、それならそれで「その感覚は正しいです」という回答でもあります。

投稿2020/02/14 10:52

編集2020/02/15 00:42
quickquip

総合スコア11235

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

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

0

if(dataTimeCheck(sDate, null, holiday))」のようにしてしまった方がいいと思います。

だとすると、このコードを見たときに「nullの部分の引数って、もともと何なの? nullを渡すと何が起きるの?」と言う疑問が発生します。javadoc を用意しますでしょうか。引数の多い/少ないオーバーロード版があることで「渡した引数のみが評価対象となる」と言う、メソッドを提供したプログラマーの意思表示になります。そう言う意味で、少なくとも私はオーバーロード版があった方が良いと考えます。

投稿2020/02/14 09:57

dodox86

総合スコア9256

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

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

0

ベストアンサー

皆さんはどのように思いますか。

使う側であれば, パラメータが少ない方を使います.
機能のコードは短いに越したことはないと思いますので.

作る側であれば, 例えば十中八九特定の値( null 等)となるような引数なら, オーバーロード版も作るかも知れません.
大した労力ではありませんし, 先に書きました通り自分が使う側であれば有れば使うだろうからです.
もしそのメソッドが極小さいクラスの主な機能を処理するものであれば, そのパラメータは削除してクラスのフィールドとして用意し, setter なりコンストラクタなりで設定出来るようにする可能性もあり, その場合はコンストラクタがオーバーロードされることになるかもしれません.

投稿2020/02/15 18:40

編集2020/02/15 18:56
jimbe

総合スコア13209

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

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

0

オーバーロードがなければ

無効値の変更
引数の追加

等をしたばあいプロジェクト全体を 修正することになります。

同機能があれば1クラスの修正で完了します。

投稿2020/02/14 10:16

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Zuishin

2020/02/14 11:04

そうですか?
退会済みユーザー

退会済みユーザー

2020/02/14 11:08

出てない部分の利点はだけどね
Zuishin

2020/02/14 11:09

オーバーロードをそんな目で見たことはなかったんですが、引数増やしたら結局同じじゃないですか?
退会済みユーザー

退会済みユーザー

2020/02/16 04:15

java.util.Dateのように、オーバーロードされたコンストラクタのうちいくつかが非推奨になったり削除されたりという例もありますからね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問