JAVA関連のことを調べてみた

JAVA関連のことを調べてみた

MetadataValue について

# MetadataValue とは
MetadataValue とは Block など多くのクラスが持つ、文字通りメタデータそのものです。
プラグインのインスタンスを利用してデータの保存空間を作成し、鍵となる文字列を用いてデータを識別します。

https://jd.papermc.io/paper/1.20.6/org/bukkit/metadata/MetadataValue.html

**サーバーを止めると、ブロックに保存された MetadataValue は消去されます!**

# 操作
Metadatable を実装したクラスで
– `hasMetadata`
– `getMetadata`
– `removeMetadata`
– `setMetadata`
の各種メソッドを用いて操作します。

has はそのプラグインの名前空間に指定された鍵に対応する MetadataValue が存在するか否かを返します。

get は与えられた文字列に対応するキーを持つメタデータを詰めたリストを返します。対応するデータが1つもない場合は空のリストが返ります。

remove は

元記事を表示

【Java】ラムダ式とStream APIメモ

## はじめに
Javaの案件の面談でよくラムダ式、Stream APIについて知見があるか質問されるのでまとめました。

## ラムダ式、StreamAPIのメリット
ラムダ式のメリット:
1. 可読性の向上
2. 簡潔な構文
3. 無名の関数を作成

Stream APIのメリット:
1. 可読性の向上
2. 並列処理によるパフォーマンスの改善

## ラムダ式
Java 8以降で導入された機能です。
主に関数型インターフェースの実装を簡潔に書くために使用されます。
関数型インターフェースとは、抽象メソッドが1つだけ定義されているインターフェースのことを指します。
抽象メソッドとは、詳細未定(中身が無い)のメソッドのことを指します。

構文
“`
(引数) -> {処理内容};
“`
* 引数の型を記述する必要はありません
* 引数は複数可能です
* 引数が1つの場合は()を省略できます

サンプルコード

“`java
// 関数型インターフェース
public interface SampleInter

元記事を表示

Javaで「多次元配列の長さを取得する(length)」の動作を確認してみた

# 概要

Javaで「多次元配列の長さを取得する(length)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/array/index9.html

# 実装

以下のファイルを作成しました。
“`JSample9_1.java
class JSample9_1{
public static void main(String[] args){
int[][] num = {{87,54}, {76,92,48,58,84}};

for (int i = 0; i < num.length; i++){ for (int j = 0; j < num[i].length; j++){ System.out.println("num[" + i + "][" + j + "] = " + num[i][j]); } } } } ``` 以下のコマンドを実行しました。 ``` $ javac JSample9_1.java $

元記事を表示

Spring Data JPA(Java Persistence API)のクエリメソッドの種類一覧

# ■ 概要
Spring Data JPAの機能であるクエリメソッドで使いそうなメソッドをまとめた
– [基本的なクエリメソッド](#-基本的なクエリメソッド)
– [リポジトリで定義できる単純なクエリメソッド](#-リポジトリで定義できる単純なクエリメソッド)

# ■ 基本的なクエリメソッド
### ● 全てのエンティティ
“`java
List items = itemRepository.findAll();
“`
“`sql:生成されるクエリ
SELECT i FROM Item i
“`

### ● 指定されたIDに対応するエンティティ
“`java
Optional item = itemRepository.findById(1);
“`
“`sql:生成されるクエリ
SELECT i FROM Item i WHERE i.id = :id
“`

### ● 指定されたIDのエンティティが存在するかを確認
“`java
boolean exists = itemRepository.existsById(1);
“`

元記事を表示

SELECT文でデッドロックするパターン

# SELECT文でデッドロックになるパターン
PostgreSQL+Springを使用しているシステムにて、いくつかの特殊な状況が重なりデッドロックが発生した。
ざっくり言うと以下の順序で処理が発生した結果、デッドロックが発生。

+ トランザクションAがSELECT * FROM user_attr;
+ トランザクションBがTRUNCATE user_attr;
+ トランザクションAを発生させたJavaプログラムが別のトランザクションCを発生させ、SELECT * FROM user_attr;

## PostgreSQLのTRUNCATE周りの仕様
PostgreSQLのTRUNCATEはOracle/MySQLと違いロールバックが可能。
ただし、TRUNCATEの実行によりAccessExclusiveLockを獲得し、TRUNCATE実行中のSELECT文をブロックする。

## PostgreSQLのSELECT仕様
SELECT文を実行すると、AccessShareLockを獲得する。
これはAccessExclusiveLock(=TRUNCATE)をブロックし、

元記事を表示

2つのオブジェクトのフィールド値をすべて比較する

JUnitを使用したテストを行おうとしましたが、2つのオブジェクトのフィールド値の比較でSamePropertyValuesAsが使えず
一個ずつassertEqualsでチェックするのも~~面倒くさい~~大変なので
ChatGPTを使い生成してみました。

□比較のためのクラス
“`java:DeepComparator.java
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

public class DeepComparator {

public static boolean deepEquals(Object obj1, Object obj2) {
return deepEquals(obj1, obj2, “”);

元記事を表示

Jilt使い方メモ

# Jiltとは
– ビルダークラスをアノテーションプロセッサーで自動生成する Java ライブラリ
– 単純にソースコードを生成する仕組みなので、実行時に依存関係は不要となり、バイトコードをいじるといった黒魔術も使わない
– 必須プロパティを強制できる形式のビルダークラス(Staged Builder)を生成できる

# 環境
IDE: IntelliJ IDEA 2024.1.3 (Community Edition)

“`text:Gradle
> gradle –version

————————————————————
Gradle 8.8
————————————————————

Build time: 2024-05-31 21:46:56 UTC
Revision: 4bd1b3d3fc3f31db5a26eecb416a165b8cc36082

Kotlin: 1.9.22
G

元記事を表示

【Java】ABC049C_Daydream #AtCoder

自分用にAtCoderの解答をまとめていきます。誤った情報があったら、申し訳ございません。

## 覚えること

– StringBuilderクラス
StringクラスはImmutable(不変)なクラスであるため、変更ができない。そのため、StrigBuilderで変更できるようにする。今回の例だと、reverseメソッドで逆順にする。toString()でString型に戻すこともできる。

– startWithメソッド
Stringクラスのメソッド。文字列が指定された部分文字列で始まるかどうかを判定することができる。
– 逆から考える
今回の例だと、前から考えるとprefixな関係になってしまう。そのため、逆から考えると、楽に処理することができる。

## コード
“`java:ABC049C_Daydream
import java.util.Scanner;

public class ABC049C_Daydream {
public static void main(String[] args) {

try (Scanner sc = ne

元記事を表示

VSCodeでJavaを動かしてみる(Mac)

# 1.Javaのインストール
 まずはJavaをインストールしましょう

ダウンロードサイト
https://www.oracle.com/java/technologies/downloads/?er=221886#jdk22-mac

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3500655/e58165b6-98e5-daf0-a5fe-50a004a79f99.png)

どの製品をダウンロードするかは、以下のサイトを参考にしました

参考サイト
http://www602.math.ryukoku.ac.jp/OOProg/jdk-mac.html

# 2.VSCodeのインストール

VSCodeをインストールしましょう

https://code.visualstudio.com/download

次に、拡張機能「Java Extension Pack」をインストールしましょう

参考サイト
https://qiita.com/aoyaman/items/cd

元記事を表示

LINE Notify for Java 自分用メモ

Line Notify

【事前準備】
①[Line Notify公式サイト](https://notify-bot.line.me/ja/)でTOKENを取得
②Line Notifyをグループに招待

“`java
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URLEncoder;
import java.net.URL;
import java.util.Scanner;

public class LineNotify {

// LINE Notify トークン
private static final String TOKEN = “YOUR_TOKEN”;
// LINE Notify APIエンドポイント
private static final String URL = “https://notify-api.line.me/api/notify”;

private static Stri

元記事を表示

Javaで「多次元配列の初期化」の動作を確認してみた

# 概要

Javaで「多次元配列の初期化」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/array/index8.html

# 実装

以下のファイルを作成しました。
“`JSample8_1.java
class JSample8_1{
public static void main(String[] args){
int[][] num = {{87,54,67}, {76,92,48}};

for (int i = 0; i < 2; i++){ for (int j = 0; j < 3; j++){ System.out.println("num[" + i + "][" + j + "] = " + num[i][j]); } } } } ``` 以下のコマンドを実行しました。 ``` $ javac JSample8_1.java $ java JSample8_1 num[0][0] = 87 num

元記事を表示

【Java】インターフェースのdefaultメソッド衝突問題をアドホックに解説する

## README
– この記事の内容はあくまで”Java Sivlerの試験で問題を解くためのもの”です
**正しい情報ではないので注意**

## はじめに
### 経緯
Java Silverの勉強してる時に、Interfaceのdefaultメソッドの衝突問題が出てくる。
これがまあ自分にとっては分かりづらい。
自分の直感に対して、出力の違うことがいっぱいある。
そのため、自分のためにイメージ図を作成して覚えることにした。

### ゴール
以下のようなコードの挙動が説明できるようにする。

– 親クラスのInterface vs 子のInterface
“`java
interface InterfaceWithSuper {
default void hoge() {System.out.println(“this is interfaceWithSuper hoge”);}
}

interface InterfaceWithChild {
default

元記事を表示

MongoDBのインデックスとは

## はじめに
業務でMongoDBを使用しており、今一度インデックスについて理解を深めるため記事にしようと思います。

## インデックスとは
インデックスとはクエリの高速化、つまり**DBから欲しいデータをより早く取得するための技術**です。

わかりやすい例として図書館がよく挙げられます。
本が無造作に散らばっている図書館で本を探そうとするところを想像してみてください。時間がかかりますよね。そこで活躍するのがインデックスで、図書館の目録のような役割をして、必要な本を直接案内してくれるみたいなイメージです。

## インデックスの種類
### 単体インデックス
単体インデックスは、コレクションの1つのフィールドに対して作成されるインデックスです。このインデックスを使用すると、そのフィールドの値に基づいてドキュメントを迅速に検索できます。
“`java
db.collection.createIndex({ user_id: 1 });
“`
このコマンドは user_id フィールドに昇順の単体インデックスを作成します。1は昇順、-1は降順を表します。
**単体のフィールドに基

元記事を表示

Ubuntu環境でOpenJDKインストール

# はじめに
Ubuntu環境でOpenJDKをインストールする手順を整理しようと思います。

# 環境
Ubuntu 22.04 LTS

# 事前準備
事前にaptをアップデートしておきます。
“`console
$ sudo apt update
“`

# OpenJDKインストール
OpenJDKをインストールする手順は以下のようになります。

## コマンドを実行してOpenJDKをインストール
`$ sudo apt install openjdk-{バージョン}-jdk`コマンドを実行して、OpenJDKをインストールします。
`{バージョン}`は、インストールするOpenJDKのバージョンを入れます。
以下の例は、OpenJDK 21をインストールするコマンドです。
“`console:インストール例
$ sudo apt install openjdk-21-jdk
“`

## インストール完了を確認
Javaのバージョンを確認することでインストールが完了できたことの確認ができます。
“`console:バージョン確認
$ java –version

元記事を表示

Androidビルドエラー解決方法「The binary version of its metadata is X.X.X, expected version is X.X.X」

こういうエラーの解決方法

– **Class ‘XXX’ was compiled with an incompatible version of Kotlin.The binary version of its metadata is 1.8.0, expected version is 1.6.0**

意訳

– パッケージ「 Kotlin `1.8.0` が欲しいよ〜。 君が持ってる `1.6.0` じゃ古すぎて嫌だよ〜。」

どうすれば良い?

– 必ずしも `1.8.0` ぴったりを用意する必要はなく、少し新しめの Kotlin を用意すれば解決することが多いです。ただし**コピペで終わるような解決策がない**のでちょこっと知識が必要です。急がば回れです。

# Kotlinを新しくしたいだけなのに…

面倒なたらい回しが始まるので覚悟しましょう。数字は今回適当なのでエラーを見ながら設定しましょう。

– パッケージ 「Kotlin `1.8.0` が欲しいよ〜」
– Kotlin 「KGP `1.8.0` が欲しいよ〜」
– KGP 「Gradle `7.3.3`

元記事を表示

【備忘録】spring.jpa.hibernate.ddl-autoで大失敗した話

現在アサインしているプロジェクトでは、Springbootを使用しているのですが、設定の中身を理解せずにいじったことで大失敗を犯してしまいました。
大失敗とは何かというと、プロジェクトのDB上のテーブルをほぼ削除してしまうという、とんでもなく恐ろしい事でした。(まぁ、言われた通りにいじっただけなので自分が完全に悪かったというわけではないと思いたい…)

spring.jpa.hibernateとは

application.propertiesファイルに書いて、DBの設定を行うことが出来るものです。
詳しくはまた別記事で纏めようと思います。

ここでは一旦、「DBを色々いじれるもの」という理解で良いかと思います。

spring.jpa.hibernate.ddl-auto に設定可能な値

この値では、データベーススキーマ(テーブル)を設定することが出来ます。

・none
➙何もしない
・validate
➙検証をする。 しかしデータベースには変更を加えない。
・update
➙アプリケーション起動時に、Entity

元記事を表示

【備忘録】nullポチェックのお話

前回投稿した記事で、NullPointerExceptionについて整理しました。
(https://qiita.com/saionji-kimochi/private/bdc1671568139352ff84)
↑の記事のまとめで、仕様上nullになる可能性がある場合はnullポチェックを行ってエラー落ちを回避する必要があると書きました。

今回はそのお話です。

やり方

一般的なやり方は、「if文で参照元がnullでなければ参照を行わない」という条件を加えることだと思います。

というか、それ以外知りません。あれば教えてください。

以下具体例です。

“`java
int sample = null;

if(sample != null){
System.out.printLn(sample * 3);
}
“`
このように、中身がnullではない時にのみそれを参照するようにすればnullポで落ちることを回避できます。
また、String型は上記の方法に加えて、isEmpty()メソッドも使うことが出来ます。
“`java
String samp

元記事を表示

【備忘録】NullPointerException との付き合い方

【備忘録】NullPointerException との付き合い方

今まで、NullPointerExceptionが出てきたときは何となくで対応していました。

業務をこなしていく中で段々と何について怒られているのか分かってきたので、整理もかねて纏めていきます。

NullPointerException とは

NullPointerException とは『NullPointerException は、java.lang. RuntimeException クラスのサブクラスで Java プログラムの実行中に参照型変数を参照しようとした時に null 値であった場合、スローされるランタイム例外です。』とのことです。

要は、nullのものからはgetterとかは使えませんよ~みたいなことです。
次で具体的にまとめていきます。

具体例

例えば、下記のようなクラス型の配列を使用するとします。

“`java:sampleClass.java
public class nullpo {
public static cl

元記事を表示

【備忘録】.isEmpty()の話

以前投稿した記事で、String型のnullチェックは.isEmpty()を使えばいいということを書いたんですが、どうやらこのメソッド2つあるらしいのでその違いと注意点をまとめていこうと思います。

String.isEmptyとStringUtils.isEmpty

isEmptyメソッドには「String.isEmpty」と「StringUtils.isEmpty」があるそうです。

共通点としては、どちらも『空文字判定をしてくれる』という点でが挙げられます。

相違点

では、どういった点が異なっているのか。
答は『null判定をしてくれるか否か』という点にあります。

StringUtils.isEmptyは空文字の場合trueを返すのと同時に、nullの場合もtrueを返してくれます。

一方で、String.isEmptyはnullの場合はNullPointerExceptionが発生してしまいます。

この違いを明らかにしておかないとnullチェックの意味を成せないということになってしまいますね。

【備忘録】プリミティブ型とラッパークラス

私は業務に入ってもうすぐ1年たつことになるんですが、いまさらプリミティブ型とラッパークラスの違いを理解した(6割ぐらい)のでここにまとめていこうと思います。

絶対に研修でもやったんでしょうけど、実際にやってみて困りださないと理解できないもんですねぇ。

プリミティブ型

プリミティブ型ってのは この記事によると


プログラミング言語などが仕様として提供する基本的なデータ型。または、定義に他のデータ型を用いない独立したデータ型。

ということらしいです。

どんな方があるかは、いくらでもまとめているサイトがあるのでそちらを参照してもらって、、、

頭文字が小文字になってるやつがそれです。(int,longとか)

ラッパークラス

一方で、ラッパークラスは