wataruの部屋

20代駆け出しシステムエンジニア 低学歴な人生を歩んで来たため仕事させてくれる社会に感謝しています。 ブログの内容は映画やプログラミングに関することなど...

【Java】ユーティリティクラスとは便利なクラスである。ユーティリティそれは、有用性

f:id:koko55120:20190423234331j:plain



こんにちは!
Javaの開発でユーティリティクラスというものを聞いたことはありますか?
開発の現場で、まずユーティリティクラスってあるの?みたいなところから始めたり...

自分は、聞いたことなかったんですが、かなり便利なんです。

今回は、ユーティリティクラスってどんなものなのか?というのを現場で学んだことをアウトプットしていきます。



目次

  • ユーティリティクラスってなんなの?
  • ユーティリティクラスの構成
  • ユーティリティクラスのメリット



ユーティリティクラスってなんなの?


そもそもユーティリティという言葉は
”英単語で、「役に立つもの」「有用性」「効用」「公益」などの意味。 住宅建築におけるユーティリティールーム(家事室)のこと。”


という正直意味不明なんですが。
便利であるって感じですかね。

ユーティリティクラスも同じような意味でとにかく便利なクラスです!

特徴としては、便利なメソッド群をstaticな領域にまとめて、使いたい時に簡単に呼び出すという万能なクラスです。

例えばですが、いくつかのクラスでObjectがNullおよび空文字かどうかを判定して、booleanで返したい。そんなときにわざわざクラスごとにメソッドを定義するのはアホくさいですよね。

抽象クラスにまとめておくとかでも良いんですが、ObejectがNullおよび空文字かの判定って結構使いそうじゃないですか?

だったらstaticなクラスに定義してパラメータ渡して簡単に呼び出そうよって感じなのがユーティリティクラスです。



ユーティリティクラスの構成

ユーティリティクラスのイメージは説明したので次は構成です。

ちょこっと書くとこんな感じ。

public static class test {

 private test(){ //コンストラクタをprivateにしてインスタンス化させない
}

public static boolean method(String o){ //例えば引数に受け取ったオブジェクトのNull判定する場合とかね。
 if (o == null | o.equals("")){ 
return true;
}

public static int method(String o){ //例えば引数に受け取ったオブジェクトをintに変えて返すみたいな。
 { 
int a = Integr.parseInt(o);
 return  a;


}

クラスとメソッドのアクセスはstaticですね。インスタンス化しないで呼ぶようなイメージ

あと、インスタンス化させないようにコンストラクタはprivateですね。

なんかこういうのメソッド使うなぁみたいなのを定義しておくと良いですね。

ユーティリティクラスに定義しておきたいものとして
・文字列変換
・空白文字削除
・ソート
・日付インスタンス取得

とかですかね。




ユーティリティクラスのメリット


メリットとしては、共通の機能群みたいな位置づけでいろんなところで使いまわせるところではないでしょうか。

あとは、共通化することでソースコードが減ったり、インスタンス生成しないしゴミも増えない。

staticの呼び出しで何をしているかわかりやすいとかなどじゃないですかね。


しらんけど。

まとめ

ユーティリティクラスはstatic領域にある便利な機能群

現場によって、ユーティリティクラスは絶対違うと思うし。ネットで見ると反対派がいるんですね~

結構便利だと思ったんだけどなw

ユーティリティクラスについて認識間違ってたらコメントください。

<Java>private static finalな定数って何なの? staticにする意味あるんすか....

f:id:koko55120:20190330113116j:plain

こんにちは!
Javaのクラスのみで使う定数でアクセス修飾子で"private static final"ってやつ
見ますよね。
そもそもこのアクセス修飾子の本質的な意味を考えていませんでしたが、
staticにする意味あるのか...とか思ったのでいろいろ調べてみました。

class test {

private static final String = "HOHE_HOGE_HOGE”;

}


初めに結論から言うとprvate static final修飾子は

そのクラスでしかアクセスできない、かつクラスに1つである定数であり
staticにすることでメモリを抑えるというメリットがある。
インスタンスを複数生成することを前提とするクラスには効果があり


そもそも、private修飾子はそのクラス内でしかアクセスできません。
※サブクラスからもアクセスはできない。


次にstatic修飾子というのは、クラスに対して静的である。(意味不明)
簡単に言うとインスタンスをいくつ生成しようがそのクラスに1つしか存在しない
ことを担保する修飾子です。
アクセス修飾子については以下の記事で書いてあります。
wataru55120.hatenablog.jp


本題です。
privateでfinalというのはそのクラスでしかアクセスできない定数であるということ。

class test {

private  final String = "HOHE_HOGE_HOGE”;

}

とすれば、宣言したクラスでしかアクセスできない"HOHE_HOGE_HOGE"という初期値に変更が無いことを
担保していますよね。

つまりこの定数にアクセスするには、このクラス自体がstaticでない限り
インスタンス化をする必要があります。

しかし、インスタンス化するということは、定数がstaticである必要がないのでは...
と思いますよね。

調べた結果

static変数とインスタンス変数の違いは
クラスに対して1つであるか。インスタンスに1つであるという違いです。

クラスで複数のインスタンスを生成する場合は、それぞれ使い分ける
必要がありそこに意味があります。

定数をstaticにすれば、インスタンスごとではなくクラスの大して1つしか
存在しないためメモリを抑えられます。

つまり
インスタンスを複数生成することが前提なクラスにメモリを抑えるメリットがあり
1つしかインスタンスを生成しないことが前提あればstaticにする必要はそこまでない
ということになります。


うーん。調べながらなので間違ってたならすみません。

<SQL>テーブル結合 

データベースを扱う時、二つのテーブルからデータを取り出して結合したい時ってありますよね。
Joinという関数を使いましょう
あと、INNER JOIN句は結構使いますね...


内部結合

それぞれのテーブルから指定したカラム名の値が一致した箇所だけを結合する結合です。

INNER JOIN句を使用します。

構文
SELECT カラム名1,カラム名2, .... FROM テーブル名1
INNER JOIN テーブル名2 ON 結合する条件

上記の文で行っていることは、テーブル名1からカラム名1とカラム名2を取り出す
テーブル名2から テーブル名1と指定したカラム名が一致すればテーブル名1に結合しなさい。
という処理です。

具体的に説明しましょう。
以下のテーブルがあったとします。

USER_INFO

USER_NAME USER_ID CONFIG
wata A001 プロパー
koji B001 派遣
hoge C001 契約

USER_INFO_LOG

USER_ID FIXED_DAY
A001 YYYY/MM/DD
B001 YYYY/MM/DD
D001 YYYY/MM/DD

USER_INFOテーブルから値を取り出してUSER_INFO_LOGから同じUSER_IDがあれば結合したい...という時

SELECT * FROM USER_INFO As A
INNER JOIN USER_INFO_LOG As B ON A.USER_ID = B.USER_ID;


このSQLを流すと..

USER_NAME USER_ID CONFIG USER_ID FIXED_DAY
wata A001 プロパー A001 YYYY/MM/DD
koji B001 派遣 B001 YYYY/MM/DD

となる。USER_INFOのA001とB001がUSER_INFO_LOGのUSER_IDと一致するため結合される。

注目すべき点はC001が無いこと。
INNER JOINではベーステーブルから条件に一致しない箇所は削除されて結果出力します。

外部結合

内部結合と同様にそれぞれのテーブルの指定したカラムの値が一致するものを結合するの加え
どちらかのテーブルにしか存在しないものも取得する。

構文は以下

SELECT カラム名1,カラム名2, ...FROM テーブル名1
LEFT(RIGHT) OUTER JOIN テーブル名2 ON 結合の条件

LEFTとRIGHTとは何ぞやと...


LEFT OUTER JOIN → 左側のテーブルを軸にして外部結合
RIGHT OUTER JOIN → 右側のテーブルを軸にして外部結合

要はON句でどっちを基準にするかという話です。
具体的に書いてみます。


左から。LEFT OUTER JOIN

SELECT * FROM USER_INFO AS A
LEFT OUTER JOIN USER_INFO_LOG ON A.USER_ID = B.USER_ID

以下になります。

USER_NAME USER_ID CONFIG USER_ID FIXED_DAY
wata A001 プロパー A001 YYYY/MM/DD
koji B001 派遣 B001 YYYY/MM/DD
hege C001 派遣 NULL NULL


当然左を基準とするため、USER_INFOテーブルの値はすべて出力されます。
3行目です。NULLとなっている箇所はUSER_INFO_LOGで一致していない箇所になります。

OUTER JOINはINNER JOINと違って切り捨てません。
一致しない場合は結合相手のところをNULLで埋めます。



次です。RIGTH OUTER JOIN

SELECT * FROM USER_INFO AS A
RIGHT OUTER JOIN USER_INFO_LOG ON A.USER_ID = B.USER_ID

USER_NAME USER_ID CONFIG USER_ID FIXED_DAY
wata A001 プロパー A001 YYYY/MM/DD
koji B001 派遣 B001 YYYY/MM/DD
NULL NULL D001 YYYY/MM/DD

3行目はUSER_INFO_LOGと一致しない箇所をNULLで埋めています。


まとめ

以上が結合です。
仕事中にまじで意味不明すぎて調べたものをアウトプットしています。間違ってたらすみません....

<カップ麺>富山ブラック麺屋いろは

麺屋いろはと言えば富山ブラック系のラーメン屋で東京ラーメンショーで売上1位となっている強力店です!

その富山ブラックカップ麺がコンビニであったので食べてみました。

f:id:koko55120:20190321193517j:plain


まずは開封...してみます。

f:id:koko55120:20190321193526j:plain


f:id:koko55120:20190321193511j:plain

麺は中太麺で5分待つタイプですね。
もちろんかやく以外は、食べる直前に入れるので注意!


お湯を入れて5分後...

f:id:koko55120:20190321193502j:plain

液体スープを入れると真っ黒に!
f:id:koko55120:20190321193458j:plain


麺はもちもちでスープは醤油感がガツンとしている。
個人的にコショウが足りないと感じたので入れるといいですよ。

f:id:koko55120:20190321193449j:plainf:id:koko55120:20190321193453j:plain

まとめ

オーソドックスな富山ブラック系のラーメン。
個人的にコショウガツンの富山ブラックラーメンが好きですがこれもありかな。。。

MCUで最強だわ。キャプテンマーベル

キャプテンマーベルという映画が2019年の3月15日に公開されましたね。


f:id:koko55120:20190317214707j:plain

この映画についていくつか書いていきます。


目次

  • 作品情報
  • アベンジャーズ結成前の話
  • マーベルのヒーローで最強クラス
  • 制作費は控えめ?
  • 若きシールズのメンバー


作品情報

キャプテンマーベル(2019)
f:id:koko55120:20190317215242j:plain


公開日は、2019年3月15日

キャスト

ブリー・ラーソン
キャプテン・マーベル


今回のヒーローは女性です


f:id:koko55120:20190317215922j:plain

ルーム、キングコングに出演している女優ですね。

美人(笑)


ジュード・ロウ
ファンタビでダンブルドアを演じてたジュード・ロウですが
スターフォースの司令官役として今回出演しています。

f:id:koko55120:20190317220629j:plain


サミュエル・L・ジャクソン
★ニック・ヒューリー

f:id:koko55120:20190317220856j:plain

アベンジャーズシリーズでは毎回出ていますね

まだ、眼帯をしていない状態のヒューリーとして出てきます

アベンジャーズ結成前の話

舞台は1990年です。アベンジャーズが結成されるよりだいぶ前の話になります。

1960年に空軍士官として活躍し、爆発事故により超能力を手に入れ
使いこなせるように成長していきます。

f:id:koko55120:20190317222028j:plain

ニック・ヒューリーの中で最後の切り札とされる人物であり
アベンジャーズというチーム名が決められた理由のひとつでもあります。

アベンジャーズ・インフィニティウォーでもヒューリーが最後に助けを求めるシーンがありますよね。
このキャプテン・マーベルは、次のアベンジャーズに向けた予習の作品ですね

マーベルのヒーローで最強クラス

DCコミックでいうスーパーマンの位置に近い。
筋力、スタミナ、耐久力、飛行能力含め最強クラスの能力をもっています。
f:id:koko55120:20190321104757j:plain

最初は手にエネルギーがあるなぁ..みたいに観てたんですが、いきなりスーパーマンレベルになっていきました。(笑)

今までのアベンジャーズヒーローでは太刀打ちできないレベルです。

マーベル最強クラスなヒーローなわけですから、アベンジャーズ4で、サノスとの闘いの切り札になることは間違いありません。

制作費は控えめ?

キャプテンマーベルの制作費は1億5200万ドル(推定)です。
アベンジャーズ/インフィニティウォー」が3億、「ブラックパンサー」が2億ドル
スパイダーマン・ホームカミング」が1億7500万ドルと比較すると少し制作費は
控えめになっていますね。
アベンジャーズに巨額な金額を投資するわけですから、バランスを取ったとい感じでしょうか。

若きシールズのメンバー

本作では、アベンジャーズシリーズでおなじみのニック・ヒューリーとフィル・コールソンが登場します。
ニック・ヒューリーはまだ両目がある状態で、フィル・コールソンはまだ一年目の新人です(笑)

一年目にしては髪薄くね...みたいな
f:id:koko55120:20190321110117j:plain

ニック・ヒューリーが片目を失った理由も書かれています。
f:id:koko55120:20190321110220j:plain

まとめ

4月に公開されるアベンジャーズの前の予習と言っても良い作品です。
シールズの歴史や、最強のヒーローの存在
来月のアベンジャーズが楽しみですな。。

Java 配列と繰り返し文間違えポイント

配列で間違えやすいポイントをまとめます

配列の宣言と初期化

・配列の初期化と要素の指定は同時にできない。

次の宣言はエラーになります。
例 int array[] = new int[3] {10,20};

new int[3]で要素数3の配列を生成した後、{10,20}で初期化しているのはエラーになります。

・基礎的な宣言の仕方

データ型 変数名 = new データ型;
 

・配列型変数の宣言と初期化する例

データ型 変数名[] = {10,20}

配列型の変数を宣言して、値を入れて代入しています。

・配列の生成と初期化する例

データ型 変数名 = new int {10,20,30}
 

・要素数0の配列の宣言

int array = {};

・多次元配列の宣言
int array = { {10,20},{30,40};

int array = new int;

int array = new int[1]; //問題なし

※配列の二次元目を空白にするのはエラーになります

int array = new int[1]; //問題なし

・繰り返し文のルール

・for文は式1、式3を省略できる。
※可読性が下がるため控えるほうがよい。

for(; i < 5; ;){}

・for文、while文、do while文は{}を省略できる

繰り返しをしたい処理が一行であれば省略することができるが
do while文の場合、doのブロックで2行の処理を記載するとエラーになる。

1 for(int i = 0; i < 5; i+) System.out.print("ここの一行が繰り返しの対象");
2 System.out.print("ここの一行が繰り返しの対象");

上記の例では、1行目の出力のみがfor文の繰り返しの対象になる。
繰り返し終了後、2行目の出力を行います。

7章<例外処理>

javaの例外処理の重要なポイントをまとめる。

もくじ

  • 例外クラス
  • try-chtch-finaly
  • throwsとthrow
  • 継承関係とオーバーライド時の注意


例外クラス

例外のクラスはthorwableクラスで全てそこから継承されている。
・メモリ不足などのエラーに関するクラスはErrorクラス
・アプリケーションで発生するエラーに関するクラスはException

例外が発生した際に例外に対する処理を必ずしなければならないものと任意のものがある。

・Exceptionクラスを継承したRuntaimeExceptionクラスおよびそのサブクラスは例外処理は任意

・ExceptionクラスおよびRuntaimeException以外のサブクラスの場合は例外処理は必ず記載する

try-chtch-finaly

Try文の記載には組み合わせルールがある
・try-catch-finalyの組み合わせ

・try-catchの組み合わせ

・try-finalyの組み合わせ

try文だけで記載するとコンパイルエラーになります。

finalyブロックは例外の発生有無にかかわらず必ず処理する。

catch文の中でreturn文がある場合。
finalyブロックが先に処理される

処理はcatch→finallyだがreturn文をする前にfinallyが実行されるということ。

catchブロックとfinallyにreturnがある場合
finallyの値で上書きされる。

catch文の戻り値があり、finallyで上書き処理をしても反映されるのは、プリミティブ型だけでcatch文の戻りを上書きしない。
参照型の場合は上書きされる。

throwsとthrow

throwsは呼び出し元に例外を投げる
f:id:koko55120:20190303151400p:plain


throwは例外を意図的に発生させる
f:id:koko55120:20190303151919p:plain


継承関係とオーバーライド時の注意

throws指定されたメソッドをオーバーライドした際のルール
・サブクラスがスローする例外は、スーパークラスのメソッドと同様かそのサブクラスとする。
・サブクラスのスローする例外はRuntimeExcepitonおよびRuntimeExcepitonのサブクラスの例外はスーパークラスに関係なくスローできる。
スーパークラスにスローがあってもサブクラスでスローしないことは可能。

スーパークラスでArrayindexoutofboundsexceptionをthrows
サブクラスでIndexoutofboundsexceptionをthrowsするのはエラーになる。

※ArrayindexoutofboundsexceptionはIndexoutofboundsexceptionのサブクラスであるため

try-catch文にも継承関係のルールがある。
・catch文でcatchする例外はサブクラスから順番に書く。

f:id:koko55120:20190303153109p:plain

スーパークラスで例外をcatchすると到達不可能になるため...