見出し画像

【Console Application】ファイルとデータベース 201【学習記】

ファイルとかデータベースの話🤤

Q.
KClass 式に書き換える必要有ったの?
A.
やらなくても良いけど Java の要素を極力排除して Kotlin で行きたいなら習得しておくべき要素かねぃ🤤
派生の名前は分からんけれどインスタンスは作りたい、というライブラリ作成は割と起きる事だと思う🙄

→文字列になってるクラス名からインスタンス生成は Java のままでも通るけれど KClass でやると getDeclaredConstructor().newInstance() が objectInstance になって文字数が減るのでオススメ🤤
→ Kotlin のリフレクションは追加要素なので import だけではなく build.gradle への implementation 追記が要る
 → IntelliJ の提案をそのままやったら入れてくれるので深く考える必要は無いけど implementation 追加後の”更新《エディタ中の右上に出る見逃しやすい小さいボタンアイコンを押す》を忘れると build.gradle がエラーを吐いたまま reflect が使えなくて混乱するので注意

#学習記 #Kotlin
#KClass #reflect

【Console Application】ファイルとデータベース【学習記】
仕様
https://note.com/sayka/n/nb8a67fa90a64?magazine_key=m7bb64c6a359f#br1mB

仕様
レコード
・レベル
 1-12
・難易度
 b,n,h,a,l
・曲名
・ランプ
 -,x,a,e,c,h,e,f

オプションスイッチ
-u file.csv # 更新(略値)
 ファイル名だけ指定した場合更新処理と見做す
-d file.csv # 削除
-p # csv 出力(略値)
 何も指定せずに起動した場合出力処理と見做す
-v # バージョン
-h # ヘルプ

----備忘録
loadCsv の解析部分は独立
reflection KClass への修正✅
万能指定 Class<?> の Kotlin 方式への書換え✅
DBAccessor.loadTable と DBAccessor.addRecord の record インスタンス生成が java のまま通ってる…?✅
略値の定数化 ( Java )
DBAccessor.setValuesWithColumn data[i] の oub of index
KDoc の説明改行直したい
DBAccessor.updateDBValueWithColumn 主キー判定は無意味(キー無し DB 対応)
DBAccessor.updateDBValueWithColumn rows → loc
DBAccessor.updateDBValueWithColumn cNameCache 直取りイクナイ
DBAccessor.updateDBValusWithColumnName タイポ
DBAccessor.deleteDBWithLine 引数確認param check抜け
DBAccessor.deleteDBWitLineAll タイポ & Doc が All じゃない方のままになってる
DBAccessor._init rClass 不具合の検査位置は rAlias より先で try-catch にすべき


Reflection

さて、それじゃ今度はクラス名を得る方法とクラス名からインスタンスを作る方法を調べようね🤤

Kotlin - 型名・クラス名の取得
https://9cubed.info/article/kotlin/0011

……… Java の String ………?🙄
確かこれ、 Kotlin としての String クラスとして取る方法が有った筈…🤔
以前少し調べてた時に KClass というので別れているとかそんな記事を見たから KClass って語を追加したら出てくるかな?🤤

Kotlinでクラスオブジェクトを参照する(Javaのクラス名.classの代わり)
https://qiita.com/sekitaka_1214/items/5d0765d314c70d1c70b6

……… Kotlin としてのクラスを取得する方法の様だけど…🤔名前は?

リフレクションでKotlinの要素を取得する【Kotlinリフレクション編】
https://qiita.com/satona-oinuma/items/d464568b0da5d271354c

Kotlinリフレクションを使うためには、パッケージの追加が必要です。

んんんん?🤔
リフレクションは特殊な仕掛けの要素だから省いてる…のかな?
普通そんな使わないだろうし確かにそうなんだけど…🙄

とりあえず名前は String になってるから K か J かは置いといてこのクラス名文字列からインスタンスを作る方法を先に探そうかな🤤

Kotlinでクラス名を決定する
https://www.techiedelight.com/ja/determine-class-name-in-kotlin/

println(s::class.qualifiedName)             // kotlin.String

何故か先に探してた Kotlin 名の取り方が出てくる等🙄

Kotlinのobject宣言したクラスのインスタンスを動的に取得する方法
https://qiita.com/kaonash/items/088800d1c186655f2277

// Foo.kt
fun main(args:Array<String>) {
  val name = args[0] // 実行時引数に"Hoge"が入っている想定
  val clazz = Class.forName(name).kotlin // これでKClassが取得可能
  val instance = clazz.objectInstance as Hoge
}

知りたかった物がずばり出てきた🤤
基本的には Java のコードとほぼ同じ様だけど forName() に .kotlin が付いてるから恐らく Kotlin では KClass の情報を追加で保持する様になっててそれが取り出せる、という事なんだと思う🤔
普通では利用されない機能ではあるものの、今回の汎用レコード化が要る学習用のライブラリでも有用な所を鑑みると手法自体は一般的って事なのかなと思う🤤
これに則って Class<*> の部分とか書き換えたらいいかな🤔

早速 .kotlin を足してみたところ🤤
型は調べなくても IDE が教えてくれる🤪

KClass に変更した時のインポート不足も IDE が提案してくれる🤤ラクだわ

すると当然 ClassKClassじゃない でのインスタンス生成方法は怒られるからこれを直したら一連の修正は完了かな🤔
何箇所かあるけど同じ修正だからそこは検索と置換で🤤

おお、珍しく IntelliJ が有能🤪
パッケージ追加が必要って記事が先に見つかってたけどそれも「やっとく?」って聞いてきてる😆
👇\やっといて/

然るべき所に追加されている事を確認🤤
でもこれ↑で先に見つけた記事と書式が随分違うお🤔
Kotlin 標準モジュール(要使用宣言)から reflect 選ぶよって事かしら、楽になったといえばその通りだけど多分この中に IntelliJ が標準で抱えてるバージョン数字込みの文字列を取り出せる配列かなんかになってるって事だろうかね🤔

Java ではインスタンスが正常に作れたかどうかを検査してるんだけど…これは rClass が Any? だから null かどうかを見れば良い…のかな?多分🤤

どうも違うっぽい🙄
<*> は <Any?> だからと思ったけどこれrClass==nullだと判定とれないぽい😞

Kotlinのリフレクション(KClass)を調べた
https://mike-neck.hatenadiary.com/entry/2016/07/16/181853

なお、kotlin extensionプロパティはnullable型(KClass<T>?)ではないので、KClass型で取得できる。

ふむ、なる程、安全の方だから常に !=null なのか…🤔
失敗した時に何になってるのか調べる方法を探すぽ😑

………

出てこないけれど例外掴むのが早いかな?🤔
どの道この検査で例外を吐くから例外をメッセージ変えて吐き直すのが妥当かしら🤤

結局例外処理に変えたけど Java の方も try-catch にしないとまずい気がしてきた🙄
まぁとりあえずその辺りは備忘録に足すとして、やっとエラー無くなったしここはこれでヨシ🤤

ここまででコミット


次回は

main の移植に取り掛かれるかな🤤

この記事が気に入ったらサポートをしてみませんか?