きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Java

Javaでメルセンヌ数を求める

Javaでメルセンヌ数(2の冪-1)を求める方法を記載します。 メルセンヌ数についてはWikipediaを参考にしてください。 前提 Java 21 対応 2の冪-1が整数となる値を求めるために次の式を使用します。 private static boolean isMersenne(int value) { return l…

Javaで二進対数(log2x)を求める

Javaで用意されているMathクラスだと十進対数(logx)だけしかないので二進対数(log2x)で計算する方法をメモします。 前提 Java 21 対応 十進対数から二進対数を割るだけです。 public static double log2(int value) { return Math.log(value) / Math.log…

Javaのtransientで本来は関わりのないデータであることを強調する

本来の使い方とは異なります。黙って使うと怒られるかもしれないので、導入の際は念のため確認してください。 Javaにはtransientという修飾子があります。これを使うことでコードで表現できることが増えます。 環境 Java 15 ユースケース コードの表現力を増…

SpringBootの@Valueではstatic変数には設定できない(設定ファイルの値をstatic変数に設定できるようにする)

SpringBootの@Valueを使用すると、設定ファイルの値を取得して変数に設定できます。しかし、static変数に関しては直接的に@Valueで設定できません。 今回の記事では、設定ファイルの値をstatic変数にも設定できるようにします。 前提 org.springframework.bo…

Javaでpropertiesファイルを読み込む

SpringBoot等のフレームワークの機能を使用すると、簡単に設定ファイルが読み込めるようになりました。 しかし、E2Eの試験をするだけのプロジェクト等では重くなりがちなフレームワークを導入したくありません。 今回の記事では、Javaのみでpropertiesファイ…

Javaの自作アノテーションのプロパティの値を取得する(ConstraintValidator)

以前、Javaの自作アノテーションを作成する方法をブログにしました。しかし、自作アノテーションに定義した変数を取り出して、バリデーションを行う方法がちょっとだけ面倒だったので、ブログに残します。 環境 Java 17 前提 テストする方法は、こちらの記事…

Javaで特定の文字数まで0埋めや任意の文字で埋めたい(padLeft, padRightのような動き)

小ネタ。 環境 Java 17 対応 java.lang.Stringを使用します。内部的にはjava.util.Formatterを使用しています。 intの場合は%0{特定の文字数}d。Stringの場合は%{特定の文字数}sで半角スペースで左埋めしたあと、replace(半角スペース, 任意の文字)で半角ス…

Lombokの自動生成コードのsetterにブレークポイントを張って容易にデバッグしたい

小ネタ。特定項目が処理の開始時は1だったのに、処理の終了時には1000が代入されていたとします。規模が小さいうちはSetterやBuilder等々の呼び出し元にブレークポイントを張っていればいいのですが、規模が大きくなってくるとブレークポイントを張るだけで…

SpringのValueに初期値を与える(エラーを起こさずにnullも初期値にする)

小ネタ。@Valueで初期値を与えたい時の記法をメモします。マッピングするプロパティがない場合、BeanCreationExceptionが発生してしまうので、それが発生しないようにします。 環境 Java 17 SpringBootTest 2.7.4 ゴール SpringのValueで初期値を渡す マッピ…

SpringでRedisを使う(データベース、キャッシュとしての使い方)

本業はJavaのバックエンドエンジニアなのですが、Redisを使ったことがないので、素振りします。 今回の記事では、データベース、キャッシュとしての機能を検証することをゴールとします。メッセージブローカー、キューとしての挙動は記載いたしません。 環境…

SpringのDisabledIfを素振りする

条件によってはテストを実行しないアノテーション、JUnit5のDisabledIfだけでなく、SpringのDisabledIfもあります。 基本的にはJUnit5のDisabledIfシリーズで十分なことが多いのですが、Spring側で用意されているものも素振りします。 環境 Java 17 SpringBo…

Flywayで特定のDBだけSQLを実行する(Spring, vender, Postgres)

小ネタ。なお、私のユースケースを満たせていなかったので、調査結果だけです。 環境 Java 17 org.flywaydb 8.5.13 org.springframework.boot 2.7.7 対応 設定ファイルの変更 PostgresやOracle等々で実行するSQLを変更するために、spring.flyway.locationsに…

Javaで1行でNull許容の配列を作りたかった

結局、願ったとおりに動かなかったので、思考錯誤したときのメモだけ残します。 環境 Java 17 対応 Collections.singletonList(T o)を使用することで、1行でnull許容した配列を作成できます。 動作確認 1行で配列を作成する方法は、List.of(), Arrays.asList…

開始日と解約"月"を元に暦上で日割のない解約"日"を求める(Java)

小ネタ。「今年の12月に解約したい。日割りが必要ない日付を教えてほしい」といった、解約する「年月」までは把握しているが、解約する「年月日」までは分からないといったケースに対応するロジックをJavaで求めます。 環境 Java 17 対応 暦上の1ヵ月の定義…

よく使うInterfaceの活用方法【Java】

Java Advent Calendar 2022の8日目の記事です。指摘コメントよろしくお願いします。 Javaに限らず、interfaceは使い道を理解することは難しいです。この記事では、私が普段使用しているinterfaceの使い方実例を記すことで、情報共有を行うことを目的としてい…

JavaのMockitoで部分モックをしたい・本物のメソッドを呼びたい(PartialMock, Answer)

JavaのMockitoを使って、対象クラスをモックにすることがあります。ただし、該当クラスのメソッドすべてではなく一部だけモックにして、他は本物のメソッドを呼びたいことがあります。 今回は、モッククラスから本当のメソッドを呼ぶ方法、デフォルト設定で…

MyBatisでEagerLoad, LazyLoadをする(Annotationにて)

MyBatisのアノテーションで親クラスのデータ取得時に、子や孫クラスを一緒に取得する方法(EAGER LOAD)、必要になってから取得する方法(LAZY LOAD)を記載します。 なお、常に子クラスと一緒に扱うときはEAGER LOAD, 必要に応じて子クラスを使用する場合は…

LazyLoadのエンティティを取得しようとしてClass Not Foundが発生した(原因不明・Spring・MyBatis)

自宅で再現できなかったので原因はわかっていません。しかし、対策はうまくいったので残します。 MyBatisにてLazyLoadで取得したエンティティの子データをJavaでgetter経由で取得しようとしました。その時にClass Not Foundが発生しました。詳細なメッセージ…

Javaでデバッグ用にnullは出力しないToStringのようなメッセージを出力したい(JSON, Object Mapper, JsonInclude.Include.NON_NULL)

タイトルではToStringを加工するような書き方をしていますが、処理イメージを伝えるものですのでToStringは使用しません。 デバッグのためにLombokで大量のフィールドをもつクラスをToStringで出力すると、当然大きな文字列となります。基本的には全フィール…

build.gradleファイルを分割する(別gradleファイルを読み込む)

JavaでGradleで開発していると、build.gradleに静的解析タスクであったり、コード自動生成タスクであったり、間接的なタスクが増えることがあります。 今回は不要なタスクを別ファイルのgradleファイルに分割する方法を記事にします。 環境 Java 17 Gradle 7…

Javaで現在行を取得する

Javaで現在行を取得する方法を記載します。 環境 Java 17 対応 現在スレッドのlineNumberを取得すれば、現在行が取得できます。 return Thread.currentThread().getStackTrace()[2].getLineNumber(); 0番目 Threadクラス 1番目 この処理している行 2番目 呼…

SpringのInterceptorでGETメソッド以外を拒否するようにコードで表現する

※ 特に見どころはありません。 業務都合にて、「アプリケーションをメンテナンスモードに切り替えても、参照系APIだけは参照できるようにしたい。更新系APIは拒否したい。」との要望が出てきました。 そもそも、「そんなこと可能?」ということを素振りした…

Javaで期間と期間を比較して重複チェックする

よくある内容の記事ですので、特別な内容はありません。私が迷わないようにするための記事です。 日付と日付を比較することは簡単ですが、日付の開始日と終了日をまとめた期間と期間を比較して、重複があることをチェックするのはたいへんです。なお、次の式…

Javaでストラテジーパターンを素振りする

ストラテジーパターンというGoFのデザインパターンが良いコード悪いコードでも紹介されていたので、素振りします。 自分の言葉で上手な言語化ができていないので、メリットは参考情報や良いコード悪いコードの購入、または別の方の記事を参考にしてください…

JavaのStaticメソッドをMockitoでモックする(ネストしたメソッドも値を返すようにする)

Javaのオープンチャットに「staticメソッドをMockitoでモックして値を返したい。NestするとNullが返るので、それを回避したい」という要望があったので、素振りしました。 環境 SpringBootStarterTestを基本としています。 Java 17 org.springframework.boot…

Javaのラムダ式(Stream API)で複数キーでCollectors.groupingByする

JavaのStream APIにて、複数キーでCollectors.groupingByする方法を記載します。 環境 Java 17 対応 前提として、次のrecordの項目を元に、Collectors.groupingByをします。 public record Book(String id, String language, int year, String salesTerritor…

Javaのラムダ式(Stream API)でNullableな項目にCollectors.groupingByする

Javaのラムダ式(Stream API)にて、Collectors.groupingByというグルーピングしてくれるメソッドがあります。ただし、このメソッドの引数はNonNullである必要があり、万が一Nullが混ざってしまうとNullPointerException: element cannot be mapped to a nul…

Gradleでマルチモジュールにしている状態から別モジュールのテストコードを共有する

テストのセットアップメソッドや、ファイルからドメインを生成するメソッド等々の便利メソッドを作るとします。マルチモジュールの場合、基本的にはプロダクトコードしか依存しないので、テストの便利メソッドは共有しません。 今回の記事では、テストコード…

【設計論】文字列だと単純にラップした型でも便利

ちょっとポエム寄りのお話です。 プリミティブ型をラップした型を作成することは、対象の業務を表現できることがメリットです。たとえば、主キーのIDが文字列だった場合に、次の制約があった場合でもプリミティブ型では伝えられません。 頭文字3桁がシステム…

メソッド呼出回数によって返却値を変更する(正常と例外)【JavaのMockito】

Mockitoを使用して、モックにしたメソッドの呼出回数によって正常な値と例外を返却する方法を残します。 環境 Java 17 org.mockito.junit.jupiter 4.0.0 ユースケース 1 対応 次の現在日付を返却するメソッドをモックにします。 public interface OffsetDate…