JAVA関連のことを調べてみた2022年04月14日

JAVA関連のことを調べてみた2022年04月14日

Effective Java 第3版まとめ(項目4)

# 項目4.privateのコンストラクタでインスタンス化不可能を強制する

## 書かれている内容

* ユーティリティクラスは、インスタンス化されるようには設計されていない(インスタンスには意味がない)
* 明示的なコンストラクタがなければ、コンパイラはデフォルトコンストラクタを提供する
* ユーザにとってこのコンストラクタは、他のコンストラクタと区別がつかない
* 抽象クラスもうまくいかない。サブクラスを作成できるし、サブクラスをインスタンス化できる。継承するために設計されていると誤解される
* privateのコンストラクタでインスタンス化できないようになる
* privateのコンストラクタでAssertionErrorをthrowすることで、クラス内から誤って呼び出された場合の保険となる

元記事を表示

JUnit5(概要〜チュートリアル)

# はじめに
Junit5のユーザーガイドをベースにテストコードを書きました。
内容は、概要把握とチュートリアルレベルになります。

# 実行環境
OS:Mac
JUnit:JUnit5.8.2
Java:Amazon Corretto 8
Gradle:Gradle6.8
IDE:IntelliJ IDEA 2022.1 Community

# Junit5とは
現在リリースされている最新のJUnitです。
JUnit5は大きく分けて以下のサブプロジェクトから構成されています。

以下、ユーザーガイドより

## JUnit Platform
JVM上でテストフレームワークを起動するための基盤です。
このプラットフォーム上で動作するテストフレームワークを開発するためのTestEngine APIが定義されています。
加えて、コマンドラインからプラットフォームを起動するためのConsole Launcherや、
GradleとMaven用のビルドプラグイン、 JUnit 4ベースのテストランナーなどが提供されており、
あらゆるTestEngineを実行できるようになっています。

#

元記事を表示

Spring Bootを2.6にアップデートするとKarateテストが落ちる。その原因と対策

# 問題が置きた環境
– JDK 17
– Spring Boot 2.6.6
– Karate 1.0.0

# 現象
Spring Boot 2.4だったアプリを2.6にアップデートしました。

そうすると2.4では通っていたテストで次のような例外が発生しました。

“`bash
java.lang.NoSuchMethodError: ‘io.micrometer.core.instrument.TimeGauge$Builder io.micrometer.core.instrument.TimeGauge.builder(java.lang.String, java.util.function.Supplier, java.util.concurrent.TimeUnit)’

at org.springframework.boot.actuate.metrics.startup.StartupTimeMetricsListener.registerGauge(StartupTimeMetricsListener.java:119)
at org.springframe

元記事を表示

(Java)Value Objectの値がnull可の場合のString型変換のより良い対処法

こんにちは!株式会社OPTiMに所属しています川田剣士です。本記事ではOPTiMでアルバイトをしていてかなり悩んだ課題について共有しようかなと思います。テーマはValue Objectの値がnullの場合のString型変換についてです。では、よろしくお願いいたします。

# 目次
[背景](#背景)
[課題1.urlがnullの時にNullPointExceptionが生じる](#課題1urlがnullの時にnullpointexceptionが生じる)
・[対処法1.String.valueOf()を利用する](#対処法1stringvalueofを利用する)
・[対処法2.Objects.toString()を利用する](#対処法2objectstostringを利用する)
・[課題1の結論](#課題1の結論)
[課題2.null時にnullが挿入されない](#課題2null時にnullが挿入されない)
・[対処法1.文字列”null”が渡された場合、ExampleUrlのvalueにnullを渡すよう実装する](#対処法1文字列nullが渡された場合exampleurlのval

元記事を表示

【初心者】Java?JDK?JRE?JVM 違いを理解したい

# はじめに
僕は Javaと聞いて Oracle? 組み込み?脆弱性対応?などのキーワードが浮かびます。
JDK・JRE・JVM の区別もついてないですが、Java を触る必要があるため、これを機に理解したいと思います。

# Javaを第三者に一言で説明したい
– Javaとは、サン・マイクロシステムズ社が開発したプログラム言語

# ざっくりまとめると
![スライド1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/c9570e18-c73d-4dce-75d4-e29e5de88bd5.jpeg)

![スライド2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/5491e51a-226a-d9b6-9d4d-7777a21859ac.jpeg)

# 用語
– Java SE
– Java Platform, Standard Edition の略。Java で使用される API

元記事を表示

「Stringを==とequalsで比較する際の違いを教えてください」と面接官に言われたら

面接官「Stringを==とequalsで比較する際の違いを教えてください」

自分「== はインスタンスの同一性を比較する一方、equalsはObjectによって定義される同値性の比較に使われます。」

自分「従ってStringを比較するとき、==では同じ文字列でも違うインスンスの場合にfalseが返って来てしまうことがあるため、通常はequalsを使用します。」

面接官「はい、完璧です。」

自分「より詳細に言うと、Stringを定数として使用する場合はJVMのLDC命令によって定数プールからインスタンスが確保されるため、これら定数プールの文字列を比較する場合は==でもtrueが返ってきます。」

自分「逆に、文字列をプログラムで動的に構築する場合は定数プールとは関係ない全く新しいStringインスタンスが構築されるため、==はfalseとなります。」

面接「なるほど。」

## String Constant Pool(文字列定数プールとは)

Javaで文字列リテラルを表現する場合、文字列は定数プールから確保される。これにより、同じ文字列が登場した場合にメモリの使用量を削

元記事を表示

Effective Java 第3版まとめ(項目3)

# 項目3.privateのコンストラクタかenum型でシングルトン特性を強制する

## はじめに

* シングルトンは一度しかインスタンスが作成されないクラス
* シングルトンにすることでテストを困難にする

## 実装方法

### その1

コンストラクタをprivateにし、インスタンスへのアクセスを提供するためのpublic static finalなメンバーを公開する

* 長所
* クラスがシングルトンであることがAPIから明らか
* 単純である
* 短所
* リフレクションによりprivateコンストラクタを呼び出せてしまう
* シリアライズ可能にするには、Serializableを実装するだけでなく、インスタンスフィールドをtransientと宣言し、readResolveメソッドを提供しなければならない

### その2

コンストラクタをprivateにし、publicなstaticファクトリメソッドを公開する

* 長所
* APIを変更せずに振る舞いこを変えることができる
* ジェネリックのシングルトンファクト

元記事を表示

Rust初心者にとってEnumは難しい!JavaのEnumと何が違うの?

# ことのあらまし

Rust入門してもうすぐ2週間のみゆきです。

Rustの列挙型は集合論では直和集合、Tagged-Union と言われたり、列挙子に値を持てる点がJavaやC#といった他の言語の列挙型と違う点と解説されています。

なんとなく雰囲気が違うのは感じ取れるのですが、私の頭では理解が追い付いてないです。

特に、RustのEnumが値を持てる点で、「そういえばJavaのenumも高機能でどんな値でも(自作型でも配列でも)持つことができたはず!」ということを思い出しました。

では、両者は一体何が違うのか実際に書いて比較してみました。

※勢いで書いているので間違ったことを書いているかもしれません ><

# Rust と Java の Enum を比較

まず、確認の意味も含めて単純なenumでJavaとRustを比較してみます。

“`rust:Rust
enum Hoge {
V1,
V2,
}

// 使い方
let hoge: Hoge = Hoge::V1;
“`
“`java:Java
enum Hoge {
V1, //ordinal(

元記事を表示

AWS Cloud9でJavaの開発環境を構築する

# 背景・目的
– KDAを試すにあたり、[必要なJavaの環境](https://docs.aws.amazon.com/ja_jp/kinesisanalytics/latest/java/getting-started.html)を準備します。
– 以前、[AWS Clou9を試してみた](https://qiita.com/zumax/items/312d20594b7eecbd533d)で構築した環境を利用します。

# 実践
## Javaのバージョンを確認
– 現在のバージョンを確認します。
– すでに、Java11が入っています。
“`
$ java –version
openjdk 11.0.14.1 2022-02-08 LTS
OpenJDK Runtime Environment Corretto-11.0.14.10.1 (build 11.0.14.1+10-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.14.10.1 (build 11.0.14.1+10-LTS, mixed mode)
$
“`
##

元記事を表示

Effective Java 第3版まとめ(項目2)

# 項目2.多くのコンストラクタパラメータに直面したときにはビルダーを検討する

## 書かれている内容

* staticファクトリメソッドとコンストラクタは、多くのオプションパラメータに対しては、どちらもうまく対応できない
* テレスコーピング・コンストラクタ・パターンは、コードを書くのが困難になり、加えてそのコードを読むのはさらに困難になる
* JavaBeansパターンは生成過程の途中で不整合な状態にあるかもしれない
* JavaBeansパターンはクラスを不変にする可能性を排除してしまう
* ビルダーはテレスコーピング・コンストラクタ・パターンの安全性とJavaBeansパターンの可読性を組み合わせている

## 個人の見解

ビルダーを検討しないといけないようなオプションパラメータが多い状況は、オブジェクトの責務が大きすぎるように思う。
まずはオブジェクト指向エクササイズの「1つのクラスにつきインスタンス変数は2つまでにすること」を心がけた上で、選択肢の1つとしたい。

## オブジェクト指向エクササイズとは

### 9つのルール

1. 1つのメソッドにつきインデントは

元記事を表示

テンプレートメソッドとは

## 概要
テンプレートメソッドとはOOPの代表的なデザインパターンの一つで、

CSVインポートとXMLインポートなど、**大まかな流れは似てるけど細かいところが違う処理**を複数作成する必要があるときに、
– 一つのクラス内で各ステップをメソッド化し、同じクラス内の別のメソッドでそれらを順番に実行するようにする
– 上記のクラスの子クラスでメソッドの内容を適宜上書きすることでいろいろな仕様に対応できるようにする

というものです。特に親クラスの「それらを順番に実行する」メソッドが「テンプレートメソッド」と呼ばれます。

親クラスが「我々を呼ばないでください、我々が呼びます」と言っているという意味で「ハリウッド原則」と呼ばれることもあるようです。

これはデザインパターンを知らなくても似たようなことをやったことがある人が多いのではないかなと思います。

## 埋め込み方法
### 親クラス
– 必要なステップをそれぞれメソッドに格納する。
– テンプレートメソッド内で上記の処理を実行する。
– 絶対上書きしてほしいメソッドは抽象メソッドにする。
– 上書きしなくてもいいメソッドはデフ

元記事を表示

コンピュータとオセロ対戦51 ~層~

https://qiita.com/tt_and_tk/items/068f2afde6db637e189f

[前回](https://qiita.com/tt_and_tk/items/54101f07855763fb4924)

# 今回の目標
全結合層、畳み込み層、プーリング層を作る
# ここから本編
## 現在のディレクトリ構成

“`
MyNet2
├── Matrix.java
├── actFunc
│   └── 活性化関数クラス
├── layer
│   └── 層クラス
└── tests
└── テストクラス
“`

## actFunc
活性化関数についてはMyNetとほぼ同じですので、省略します。

## Layer
層について、基本的な定義づけを行います。
まず層とは、ここではノードが一列に並んだものを指すことにします。ただ、これまでのように入力層や出力層を特別扱いすることはありません。また、畳み込み層とプーリング層も層です。
MyNetはノードクラスを用いたことで畳み込み層やドロップアウトなどの作成が困難でしたが、MyNet2ではネットワー

元記事を表示

Spring Boot + Vue.js + Axios でいいね機能の実現

# はじめに
Spring Boot学習中の者です。学習のためにアプリケーションを作成していて、いいね機能を実装する上で考えたこと等をまとめました。

# 参考文献

https://qiita.com/yoyoyo/items/b288f067d5de04f26046

https://masawada.hatenablog.jp/entry/2017/04/19/105243

# 使用技術
Spring Boot 2.6.6
Spring Security
Thymeleaf
MySQL
Mybatis 2.2.0
Vue.js
Axios

# いいね機能のロジック
以下の要件を満たすようないいね機能を実装しました。
1.ユーザは、一つの投稿に対し1回「いいね」を押すことができる。
2.ユーザが対象の投稿に既に「いいね」を押していた場合、その「いいね」は取り消される。

# テーブル
今回の例で使う「ユーザの投稿情報」を持つPOSTテーブルと、「ユーザがいいねした投稿情報」を持つLIKESテーブルの構成です。
POSTテーブル(主キー:POSTID)
|カラム名|POSTID|

元記事を表示

【Spring】Validation(入力チェック)

# 概要

当記事では、
  ・標準機能のValidation
  ・独自実装Validation
の実装方法について説明します。

# 標準機能のValidation
必須チェックを実装したい場合を例にすると、
「javax.validation.constraints.NotEmpty」など
下記の「 @NotEmpty(message = “入力してください。”) 」のように、
指定することで簡単に実装することができます。
“`
@NotEmpty(message = “入力してください。”)
public String mailAddress;
“`

# 独自Validation

## アノテーション実装
“`/ValidationDemo/src/main/java/com/example/demo/validation/UnavailableString.java
package com.example.demo.validation;

import static java.lang.annotation.ElementType.*

元記事を表示

【spring】flywayを使用したマイグレーション

# 概要
Springでflywayを使用したマイグレーション方法について説明します。

# 準備
## pom.xmlにflywayを追加
下記を追加する
“`/{プロジェクト名}/pom.xml

org.flywaydb
flyway-core

“`

## DB接続情報を追加
“`/{プロジェクト名}/src/main/resources/application.properties
spring.datasource.url=jdbc:mysql://localhost/{接続DB名}
spring.datasource.username={接続ユーザ名}
spring.datasource.password={接続ユーザのパスワード}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
“`

## 実行SQL文用意
“`/{プロジェクト名}/src/

元記事を表示

Effective Java 第3版まとめ(項目1)

# 項目1.コンストラクタの代わりにstaticファクトリメソッドを検討する

## 例

“`java
public class EffectiveJava1 {

// コンストラクタ
public EffectiveJava1() {
}

// staticファクトリメソッド
public static EffectiveJava1 newInstance() {
return new EffectiveJava1();
}
}
“`

## 長所

1. 名前を持つこと
1. その呼び出しごとに新たなオブジェクトを生成する必要がないこと
1. メソッドの戻り値型の任意のサブタイプのオブジェクトを返せる
1. 返されるオブジェクトのクラスは、入力パラメータの値に応じて呼び出しごとに変えられる
1. 返されるオブジェクトのクラスは、そのstaticファクトリメソッドを含むクラスが書かれた時点で存在する必要さえない

## 短所

1. publicあるいはprotectedのコンストラクタを持たないクラスのサブク

元記事を表示

Scalaの勉強はじめました 6 〜関数型プログラミング編 関数について〜

## はじめに
N予備校で「Scala応用」コースを受講しています。
今回から関数型プログラミングについてです。

## 関数型プログラミング
:::note
外部の状態を変化させない関数だけでプログラミングを行うこと
:::

外部の状態を変化させることを、**副作用**という。

### 副作用のある関数
変数を変更する
オブジェクトが持っているフィールドの値を書き換える
例外やエラーを発生させる etc.

### 参照透過性
値と式が交換できるような関数
“`scala
def square(n: Int) = n * n
“`
同じ値を入れたら必ず同じ結果になることが保証されたもの、かな。
正直テキストよりもこっちの方がまだわかりやすい。

https://gimo.jp/glossary/details/referential_transparency.html

## 関数
“`scala
val add = new Function2[Int, Int, Int] {
def apply(x: Int, y: Int): Int = x + y
}
“`

元記事を表示

【Java】Spring Data JPA関連プロパティ @application.properties

# プロパティ一覧(随時追加)
“`properties
spring.jpa.properties.hibernate.jdbc.time_zone=Asia/Tokyo
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
“`

# spring.jpa.properties.hibernate.jdbc.time_zone
・データベースのタイムゾーンを設定する。
・設定方法は2つあるが、今回は設定方法2。

 設定方法1:JDBC URLのパラメータとして設定
 設定方法2:spring.jpa.properties.hibernate.jdbc

元記事を表示

【Java】HibernateでEntity/DB間をマッピングする仕組み

# まえがき
Entityクラスに@Table,@EntityをつけてORMをなんとなくで実現していたが、その仕組みをちゃんと知ろうという記事。

https://www.baeldung.com/hibernate-naming-strategy

# 2つのNaming Strategy
・Entityクラス と DB 間で「テーブル名」「カラム名」のマッピングを行う際にNaming Strategyを利用する。
・Naming Strategyは「Explicit Strategy」と「Imlicit Strategy」の2つ存在する。
・マッピング処理は次のフローで行われる。

 ① LogicalNameの決定【Implicit Strategy】
 ② PhysicalNameの決定【Explicit Strategy】

  LogicalName:Javaで扱うテーブル名,プロパティ名
  PhysicalName:DBとマッピングさせるテーブル名,プロパティ名

# ① LogicalNameの決定【Implicit Strategy】
・デフォルトのImplicit

元記事を表示

【Java】JPA備忘録(Entity・ID自動採番・Repository・Specification・@Transational)

# まえがき
SpringBootでWEBアプリケーションを作るとき、よくSpring Data JPAを利用する。
Entityクラス関連のアノテーションや、トランザクションの動きについて時間が経つと忘れるので、備忘として残す。

# Entityクラス
“`java
@Entity
@Table(name = “sample_user”)
// @CreatedDate @LastModifiedDate を活性化するために必要
@EntityListeners(AuditingEntityListener.class)
public class SampleUserEntity implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer userId;
private String name;
private Integer age;
private String gender;
pri

元記事を表示

OTHERカテゴリの最新記事