googletag.defineSlot('/21812778492/blog_300x250_common_fixed01', [[300, 250], [336, 280]], 'div-gpt-ad-1559710191960-0').addService(googletag.pubads()); 役職は、フィールドなどを持たず、インスタンスによって処理が変わらないので、1つのインスタンでも十分となります。, 具体的どのようにしてインスタンスが1つであることを保証するかというと、コンストラクタをプライベートにして、外部からNewされるのを防ぎます。 calcSalary(給与計算)メソッドは、その社員の給与を計算するメソッドとなります。 投稿 2016/10/15 17:08 気になったら自分で勉強してみてください。, デザインパターンは、クラスライブラリやフレームワークの中でよく使用されています。 googletag.defineSlot('/21812778492/blog_468x60_common_eyecatch02_adsence', [728, 90], 'div-gpt-ad-1567575393317-0').addService(googletag.pubads()); 役職が新しく増えた時、calcSalaryメソッドを修正する必要が出てきますし、役職をint型のフィールドで判断しているため、予期せぬ値がセットされる可能性があります。, これも職種と同じくTemplateMethodパターンを使えば解決できなくもなさそうですが、Javaでは継承が単一継承しかできないため、難しそうです。 ShainFactoryクラスを導入することにより、App側でnewを消すことができました。 pbjs.setConfig({bidderTimeout:2000}); Template Methodパターンは、抽象クラスを使用するデザインパターンです。 お問合せはこちらでも受け付けています。 このプログラムにいくつかのデザインパターンを順番に適用させていくことで、リファクタリングしつつ機能の追加を行っていきます。, まずはデザインパターンを適用する前のソースを確認します。 チェックしたければ割る前に0除算か(つまり割る数が0か)をチェックするしかないでしょうね。, JavaScriptでは浮動小数点数演算しかないこともあって、ゼロで割ってもInfinityを返すだけで、例外にはなりません(EcmaScript 12.7.3.2)。, そして、JavaのdoubleもIEEE 754に従うので、Double::POSITIVE_INFINITYという定数があるように、Infinityもdoubleの範囲内の値です。, JqueryUI ダイアログ ダイアログを閉じて、再度開くとイベントが2重で発生してしまう。, React.jsでconfirmダイアログを使った時のスマホブラウザ間での動作の違いについて, public static void main(String[] args) のargsの使い方, 回答 何気なく、0で除算したら例外発生するよなと思ってテスト書いてみたけど、 double型を0で割っても例外発生しないのですね。 こうすれば通る。 | ・編集 2016/10/15 17:28, 以下の仕様のプログラムの作成をしています。 ここではその中から一部のデザインパターンを紹介します。, ここでは、いくつかのデザインパターンを学習していきますが、学習の進め方としては、まずデザインパターンが何も使用されていないシンプルなプログラムを要します。 デザイナーは外部の人間なので、社員クラスを継承しておらず、workメソッドも使用することができません。 厳密に2つの違いを知りたい場合などは調べてみて下さい。, 他のクラスに関しては、前回までと同じのため、省略します。 googletag.defineSlot('/21812778492/blog_728x90_common_eyecatch01_adsence', [728, 90], 'div-gpt-ad-1566564252373-0').addService(googletag.pubads()); googletag.defineSlot('/21812778492/blog_300x250_common_fixed02_adsense', [[300, 250], [336, 280]], 'div-gpt-ad-1565198391774-0').addService(googletag.pubads()); googletag.pubads().setTargeting('blog_type', 'Tech'); (そのうちするかも。) ここでは、社員が資格を取得すると、資格手当がついて給料がアップするという仕様を考えます。, まずは資格を表す抽象クラスを作成します。 0, 【募集】 googletag.cmd = googletag.cmd || []; 以下のShainクラスを確認ください。, 名前の通り、社員を表すクラスです。 calcSalaryメソッドでは、役職によって処理を分岐させています。 ここでは社員クラスのworkメソッドが、テンプレートメソッドに当たります。, この修正により、新しい職種が増えた場合でも、クラスを追加してmainWorkメソッドをオーバーライドすればよく、元々のソースコードに影響を与えずに済みます。 4 / クリップ C:\java>javac TestExcep3.java C:\java>java TestExcep3 0 実行開始。 j: 100 例外:java.lang.ArithmeticException: / by zero 引数を0以外の整数で入力してください。 実行終了。 C:\java>java TestExcep3 -5 実行開始。 j: 100 j/i: -20 tryブロック終了 実行終了。 Exception in thread "main" java.lang.ArithmeticException: / by zero at Baaaa.main(Reigaitest.java:6) 上記のプログラムだと、0除算が発生しているためプログラムが強制終了しています それを防ぐために、以下の例外処理を加えます。 例外の処理実装後 ここではJavaを用いて、デザインパターンについての解説をします。 インスタンスが複数あると、それぞれが影響し合って思わぬ動きをしてしまう事があります。 googletag.defineSlot('/21812778492/blog_300x250_common_sidemiddle01_adsense', [[300, 250], [336, 280]], 'div-gpt-ad-1565198726712-0').addService(googletag.pubads()); 指針については次のような感じがいいかなと。 new、List.ofなど右辺に型があるものはvarを使う方がいい(Integer、Longなど以外); java.lang、java.utilなどの基本的なクラスにはvarを使っていい; IntegerやLongなどラッパークラスは扱い注意なのでvarを使わないほうがいい; 基本型にはvarを使ってもいい 回避 割り算 切り捨て 例外 0除算 0になる 0で割る java exception math divide-by-zero JUnit 4のテストで特定の例外がスローされることをどのように主張しますか? ・入力された計算式を計算しテキストボックスに出力する GoFの23のデザインパターンでは、FactoryがつくのはFactory MethodパターンとAbstract Factoryパターンという2つのパターンがあります。 googletag.enableServices(); teratailを一緒に作りたいエンジニア. googletag.pubads().collapseEmptyDivs(); 続いて、その抽象クラスを継承した具体的な資格を表すクラスを作成します。 符号は被除算数と0の符号で決まります。 様々なパターンがあるのですが、有名なのはGoFの23個のデザインパターンです。 社員クラスでは役職をフィールドで持ち、給与計算の処理は役職に委譲します。 score 12 . [email protected], 【Java】try-catchで例外処理を実装しよう!Exceptionクラスの使い方, 【Java入門】interfaceとimplementsの使い方を基礎の基礎から解説!. また、職種を表すフィールドをint型なので、どんな数値でもセットできてしまい、不具合の元になります。, この解決策として、Template Methodパターンが使えます。 そこで、アダプターを作成することで、通常の社員を扱うのと同じ感覚でデザイナーを扱えるようにします。, デザインパターンは他にも色々ある。 前提・実現したいこと. また、職種を表すフィールドがなくなったことによって、不正な値がセットされる可能性などを排除できました。, TemplateMethodパターンで解決した問題点は、役職についても全く同じことが言えます。 クラスライブラリやフレームワークの開発にかかわる可能性のある人や、オブジェクト指向について更に理解を深めたい人は、他のパターンの勉強してみると良いかと思います。, case10さんは、はてなブログを使っています。あなたもはてなブログをはじめてみませんか?, Powered by Hatena Blog googletag.defineSlot('/21812778492/blog_300x250_common_sidemiddle02_adsense', [[300, 250], [336, 280]], 'div-gpt-ad-1565198822157-0').addService(googletag.pubads()); var googletag = googletag || {}; 以下の仕様のプログラムの作成をしています。 ・入力された計算式を計算しテキストボックスに出力する ・9/0などの0除算時にその旨を伝えるダイアログを出します。 また、入力された計 … そして、給与計算のメソッドでは資格手当分の金額を追加するようにします。, Adaptは適用させるという意味です。 評価 ; クリップ 0; VIEW 1,566; maru_o. work(働く)メソッドは、社員の仕事の1日の流れを順番よく出力する処理となっています。 googletag.defineSlot('/21812778492/blog_300x250_common_fixed01_adsense', [[300, 250], [336, 280]], 'div-gpt-ad-1565194485392-0').addService(googletag.pubads()); // fixed01のWORKSが不定期なため共通処理とする 給与は基本給が20万で、役職によって役職手当てが付く仕様です。, 先ほどのソースコードは色々と改良の余地があります。 それでは実際にJavaが動くかどうか確かめてみましょう。 パワーシェルを起動して、 java -version Stateパターンを使うことで、メソッドにより状態を変更することができるようになります。 Strategyパターンは、継承ではなく委譲を活用するパターンです。, 役職をインターフェースとして用意し、具体的な役職はそれを実装する形でクラスを作成します。, 役職をインターフェースにして、給与計算のメソッドは抽象メソッドとして定義します。 職種をクラスで表現するようになったので、職種を表すフィールドは削除します。 まず、workメソッドですが、メイン業務の部分を職種によってif文で分岐させています。 デザインパターンは、オブジェクト指向言語の中でよく使用されるクラス設計をカタログ化したものです。 これでは職種が新しく増えた時に、毎回workメソッドを修正する必要が出てきます。 ですので、デザインパターンを使うことにこだわりすぎず、オブジェクト指向設計でこういう活用方法がある、という知識を知る程度でも良いでしょう。 googletag.defineSlot('/21812778492/blog_300x250_common_ctc02_adsence', [300, 250], 'div-gpt-ad-1566564559478-0').addService(googletag.pubads()); 間にアダプターとなるクラスを介することで、既存のクラスに変更を加えることなく機能を利用できるようにするためのデザインパターンです。, ここでは、デザインの仕事を外部のデザイナーに依頼するという仕様を考えます。 googletag.defineSlot('/21812778492/blog_300x250_common_sidetop01_adsense', [[300, 250], [336, 280]], 'div-gpt-ad-1565330658303-0').addService(googletag.pubads()); ここでは、役職に対してStateパターンを使うことで、降格や昇格といった、役職の変化をメソッドで表現できるようにしてみます。, decorateは飾りつけを意味する単語で、オブジェクトに対して飾りつけをしていくことで機能を追加していくようなデザインパターンです。 googletag.cmd.push(function() { ・9/0などの0除算時にその旨を伝えるダイアログを出します。, また、入力された計算式はソースコードのformulaに代入され、0除算以外は正常に動作することは確認済みです。, 実際に0除算を行うとテキストボックスに「Infinity」が出力されcatchされない, 0除算さえ検出できればいいと思いNumberFormatExceptionをArithmeticExceptionに変更して実行するも結果は変わりませんでした。, 演算結果がInfinityであるのでdouble型に変換した時に例外処理が発生するのかと思いましたがcatchされず困っています。 その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。 社員クラスを継承した営業クラスとプログラマークラスを用意し抽象メソッドをオーバーライドします。 なので、デザインパターンを覚えて無理に使おうとするよりも、オブジェクト指向をうまく活用して効率よく開発ができないかを考える方が大事です。 これはリフレクションという技術を使うことがで、完全にnewをなくすことも可能になっています。, Singletonパターンは、インスタンスを1つだけに保証するデザインパターンです。 これにより、役職が増えてもインターフェースを実装したクラスを追加するだけで対応が可能になります。, Factoryパターンはインスタンスを生成する専用のクラス(Factory)を作成し、Factory経由でインスタンスを取得するデザインパターンです。 そしてworkメソッドの中で条件分岐していた処理を、抽象メソッドとして抜き出します。 例外処理(try-catch)って実行時に発生するエラーに対して、記述した処理が実行されるようにするために使われますよね。 例外処理の例として真っ先に思い付くのが0(ゼロ)での割り算や、ファイル操作で … Javaの基礎と、オブジェクト指向の基本を理解していることを前提とします。 }); 例外処理(try-catch)って実行時に発生するエラーに対して、記述した処理が実行されるようにするために使われますよね。, ファイルからデータを読み込む処理を記述したいけれども、読み込みたいファイルがそもそもない場合を想定しておかなければなりません。, でも、例外処理にはthrowを使った処理とthrowsを使った処理があって、似た用語なので使い分けに迷ったり、例外が重なる場合はどうすればいいのか分からなくて困ることってありませんか?, などの基本から応用的な使い方についても解説していきます。今回は例外処理について、使い方をわかりやすく解説します!, 意図的に例外を起こすとは、ある条件と一致する場合に例外を発生させ、エラーメッセージを返すということです。, それでは、サンプルコードでthrowの使い方をみていきましょう。除算(割り算)において、0(ゼロ)で割る場合の例外処理の例です。, このサンプルコードでは、throwを使ってIllegalArgumentExceptionの例外を発生させています。, 次にthrowsについて解説します。throwsは例外が発生した場合、呼び出し元に例外処理を投げることができます。, throwsで呼び出し元に例外処理を投げるか、try-catch構文を用いるかのどちらかです。try-catchを用いる場合はメソッドを使ったその場で例外処理を実装することができます。, throwsを用いる場合は呼び出し元に処理を投げるので、呼び出し元の処理によってはプログラム全体の処理が停止することもあります。try-catchを用いる場合は例外処理を実施後、それ以降の処理も実行されます。, まずは、throwsでメソッドの呼び出し元に例外を投げる場合です。サンプルコードで確認しましょう。, なお、読み込む対象となるtest.txtファイルはあえて用意をせず、FileNotFoundExceptionの例外を発生させています。, このサンプルコードでは、throwsSampleメソッドでFileReaderクラスを使用しているのでエラー処理を実施する必要があります。, この場合、throwsで呼び出し元のクラスに例外処理を投げた後の処理は中止され、例外処理をmainメソッドでcatchしてその後処理をしています。, ちなみに、throwsを使わずにtry-catch構文を用いる場合は次のサンプルコードのようになります。, この場合もthrowsを使う場合と同じようにcatchで例外処理を受けた後の処理も実行され、「処理が終了しました」と表示されています。, 例外処理が必要な処理を含むメソッドを使用する場合、そのメソッドを使用する場所でも例外処理を記述する必要があります。, メソッドを使用する場所での例外処理はメソッドの呼び出し元にまず投げられ、メソッド内の例外処理がさらに呼び出し元に投げられるということになります。, このサンプルコードでは、まずthrowsSample2メソッドで発生したFileNotFoundExceptionの例外処理をthrowsSample1に投げています。, そこからさらにmainメソッドに例外を投げてその例外をcatchしているということになります。, 例外の種類に応じて処理を分ける場合、処理を記述する順番に注意をする必要があります。hrowsを使う場合では呼び出し元のクラスに例外処理を投げ処理が終了となり、その後の処理が行われないからです。, 例外の種類が複数ある場合は、throwsの後にそれぞれの呼び出し元を「,」(カンマ)で区切って記述します。, 先に記述した例外が発生した場合はその例外処理が行われ、後の処理は実行されていません。先に記述した処理に例外が発生しなければ、後の処理も実行することができます。, このように記述する順番によって、処理が分けられる場合とそうでない場合があるので注意しましょう!, このサンプルコードでは、catch以降を「catch (FileNotFoundException | ArithmeticException e)」のように記述しました。Java7からこのような簡潔な記述ができるようになりました。ただし、親子関係にあるクラスをこのように並べて記述することはできません。, FileNotFoundExceptionクラスはIOExceptionクラスのサブクラスですので、この2つのクラスをこのサンプルコードのように並べて記述することはできませんので注意してください。, この記事では紹介しきれなかったtry catch文のいろいろな使い方を次の記事にまとめているので、ぜひ確認してください!, try-catch文にはfinallyを使って例外の発生にかかわらず必ず行う処理を記述することができます。, try-catch-finally文の使い方については次の記事にまとめているので、ぜひ確認してください!, 冒頭にも書きましたが、エラー処理で実行が止まってはトラブルの原因になる可能性がありますので、例外処理はしっかりとマスターするようにしましょう!, とは言え、習い始めの頃はなかなか慣れないかもしれませんので、使いこなせることができるようにこの記事を何度も参考にして下さいね!, 当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。