20191001のJavaに関する記事は6件です。

[OpenJDK11&JavaFX13]IntelliJ+gradleでjavaFXアプリをビルドし、軽量JREと合わせて配布可能なパッケージを作成する

配布可能なJavaFXアプリを作成したかったのですが、試行錯誤したのでこちらにまとめます。

環境

$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

※macOS Mojave(10.14.6)でも同様の手順で作成できました。

$ java --version
openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3)
OpenJDK 64-Bit Server VM (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3, mixed mode, sharing)

$ jlink --version
11.0.4

JDKの選定

最初はJavaFXを同梱しているAmazon CorrettoなどのJDKを使用しようと思っていました。
しかし、以下の記事を読んで、今回はOpenjdk-11を使用し、JavaFXはライブラリとして使用し、配布時に軽量JREを生成することにしました。
OpenJFX時代のJDK選び - もしくはOpenJFX時代のアプリケーション配布

手順

IntelliJでgradleプロジェクトを作成

IntelliJで、新規gradleプロジェクトを作成します。

Screenshot from 2019-10-01 16-05-10.png

build.gradleにjavafx用の設定を追加

OpenJFXの公式サイトに記載されていた以下のソースを参考に、build.gradleを作成します。
https://github.com/openjfx/samples/blob/master/IDE/IntelliJ/Modular/Gradle/hellofx/build.gradle

なお、IntelliJの設定でもともと設定で「Automattically import this project on changes in build script files」にチェックを入れていますので、よしなにモジュールはインポートされます。

build.gradle
plugins {
    id 'java'
    id "org.openjfx.javafxplugin" version "0.0.8" // 追加
}

group 'com.example'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

// 追加
javafx {
    version = "13"
    modules = [ 'javafx.controls', 'javafx.fxml' ]
}

// 実行可能Jarを作成する際のMainクラスを指定
jar {
    manifest {
        attributes 'Main-Class': 'Main'
    }
}

テスト用のJavaFxクラスを作成

Main.java
import javafx.application.Application;

public class Main {
    public static void main(String... args){
        Application.launch(MyApplication.class);
    }
}
MyApplication.java
import javafx.application.Application;
import javafx.stage.Stage;

public class MyApplication extends Application {
    public MyApplication(){
        super();
    }

    @Override
    public void start(Stage primaryStage) throws Exception{
        primaryStage.setTitle("Hello");
        primaryStage.setWidth(300);
        primaryStage.setHeight(200);
        primaryStage.show();
    }
}

こちらを実行した結果、以下の画面が立ち上がります。
Screenshot from 2019-10-01 16-43-52.png

buildして、実行可能JARファイルを作成

コンソールにて、gradle buildを実行します。
特に問題がなければ、実行可能jarファイルが作成されるかと思います。
Screenshot from 2019-10-01 16-47-08.png

この状態で、jarファイルを実行してみると・・・
Screenshot from 2019-10-01 16-48-17.png

このように、javafx.application.Applicationクラスが無いよと怒られます。
これは、openjdk-11.0.4のjre内に、JavaFXモジュールが存在していないからですね。

軽量JREを作成する

では、jlinkを使って今回のjarファイルを動作させるための軽量jreを作成していきましょう!
今回は、以下の記事を参考にさせていただきました。
配布用の軽量 JRE の作り方

まず、以下ページのDownloadsより、jmodsをダウンロードします。
https://openjfx.io/
Screenshot from 2019-10-01 16-54-31.png

ダウンロードしたzipファイルを展開し、適当なパスに配置します。
(今回は、/usr/lib/jvm/javafx-13-openjfx/javafx-jmods-13に配置しています。)

なお、今回はLinux用jmodsをダウンロードしました。
※各実行環境のOSに合わせ、モジュールをダウンロードしましょう。

次に、jdeps ${jarファイルパス}コマンドにて、今回のjarファイルを実行するために必要なモジュールを調べます。
Screenshot from 2019-10-01 16-56-53.png

今回は、以下のモジュールを使えば良さそうです。
・java.lang -> java-base
・java.application -> javafx.base
・javafx.stage -> javafx.controls

※本当は、jdeps --list-deps ${jarファイルパス}とすると、どのモジュールを使えばよいかわかるようですが、何故かこのオプションが使用できず・・・。

必要なモジュールがわかったので、軽量jreを作成します。
以下のjlinkコマンドで、上記のモジュールを指定して作成できました。

$ jlink --compress=2 --module-path /usr/lib/jvm/java-11-openjdk-amd64/jmods:/usr/lib/jvm/javafx-13-openjfx/javafx-jmods-13 --add-modules java.base,javafx.base,javafx.controls --output jre

カレントパスにjreディレクトリが作成されました。
jre/bin/javaのバイナリも作成されています。

Screenshot from 2019-10-01 17-23-21.png

作成したJREを使用して、JARファイルを実行する。

では、最後に作成したjreを利用して、プログラムを実行してみましょう。

$ ./jre/bin/java -jar build/libs/javafx-sample-1.0-SNAPSHOT.jar 

Screenshot from 2019-10-01 17-30-28.png

無事に実行できました!

あとはJARファイルとjreをよしなにディレクトリにまとめ、実行用のシェルやbatファイルを作成するなり、appパッケージにまとめるなりすると完成です。
(以下は、フォルダにまとめ、シェルを作った例)

$ ls
javafx-sample-1.0-SNAPSHOT.jar  jre  start.sh

$ cat start.sh
#!/bin/sh
BASE=$(cd $(dirname $0); pwd)
$BASE/jre/bin/java -jar $BASE/javafx-sample-1.0-SNAPSHOT.jar

## sh start.shで実行可能

お疲れ様でした!

初めてjlinkやjdepsなどのコマンドを使い軽量JREを作成しましたが、使用者の環境(jdkなど)に依存しないで実行できるJavaFXアプリを作る際は、この方法が簡単かなと思います。
なお、今回のjreディレクトリのサイズは368.3MBなので、もっと色々できるようにすると重たくなってしまうのかな?

以上です。ありがとうございました!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【SpringBoot】プロジェクトの作り方(初心者向け)

今回やること

  1. SpringBoot + Java8 + gradle のプロジェクトを作成します。
  2. localhost:8080にクロームでアクセスしたら、「Hello World」を表示します。

環境

  • IntelliJ
  • Mac
  • java8

Spring Initializrでプロジェクトの原型を作る

  • Spring Initializrの公式ページを開きます。  2019-10-01 17.27.51.png
  • ここで自分に必要な要素を選択して作っていきます。  2019-10-01 17.28.40.png  2019-10-01 17.29.00.png
  • 選択が完了したら、Generateボタンをクリックします。  2019-10-01 17.29.32.png
  • 自分の指定した場所にzipができるので、解凍します。  2019-10-01 17.30.18.png

プロジェクトをIntelliJで開く

  • さきほど解凍したフォルダを開きます。  2019-10-01 17.31.01.png
  • build.gradleファイルを右クリックして、IntelliJで開きます。  2019-10-01 17.31.42.png  2019-10-01 17.32.11.png

Hello Worldを表示する

  • 初期で作られているSampleApplicationクラスには何も手を加えずに、
    SampleApplicationクラスと同階層のディレクトリでControllerクラスを新規作成します。
HelloController.java
@RestController
public class HelloController {

   @GetMapping("/")
    public String index() {
        return "hello world";
    }

    @PostMapping("/")
    public String index2() {
        return "こんにちは";
    }
  • 「localhost:8080」にアクセスするとGETメソッドが呼ばれて、
    文字が表示されます。  2019-10-01 17.52.39.png

注意点

  • thymeleafは不要です。
  • コードに変更を加えた時は、「■(停止)」を押下しないと、
    多重起動になるのでいちいち消してからRunしましょう「▶」。
  • RestAPIを作りたい時は、「@Controller」ではなく
    「@RestController」をつけましょう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【GradleでJakartaEE 8 アプリケーション開発】1. 環境構築

はじめに

私は業務でJakartaEE (Java EE) を使用したエンタープライズアプリケーションを開発しています。
これまでは参考書を読みながら学習し開発してきましたが、環境構築から開発手順までまとまっている、自分に合ったドキュメントがなかったので、今までの知識を連載形式でまとめていきたいと思います。

環境

※2020年3月現在のバージョンをもとに選定しています。

項目 内容
OpenJDK ビルド Azul Zulu 11
フレームワーク Jakarta EE 8
APサーバ payara server 5.201
DBサーバ PostgreSQL 12
ビルドツール Gradle 6.2.2
IDE Eclipse 2020-03 (Pleiades All in One)
OS Windows 10

1. 環境構築

OpenJDK 11 インストール

今回はAzul Zuluを使用します。
payara server 5.192からJava 11対応がされたため、OpenJDK 11としています。
https://jp.azul.com/downloads/zulu-community/?&architecture=x86-64-bit&package=jdk
上記リンクから、 Java 11 (LTS) の Windows 版 msi をクリックしダウンロードします。
image.png

ダウンロードしたMSIファイルを実行します。
Next をクリックし、インストールフォルダはデフォルトのまま、 Next をクリックします。
image.png

Install をクリックし、インストールを開始します。
インストールが完了すると下の画面が表示されますので、Finish をクリックします。
image.png

次に環境変数を設定します。
Windowsの設定にて「環境変数」と検索し、「システム環境変数を編集」を選択します。
image.png

環境変数 をクリックします。
image.png

システム環境変数の 新規 をクリックします。
image.png

下記のシステム環境変数を設定します。
下表の通り入力し、OK をクリックします。

変数名 変数値
JAVA_HOME C:\Program Files\Zulu\zulu-11

image.png

image.png

コマンドプロンプトを起動し、「java -version」を実行し下記の結果が表示されればインストール完了です。
image.png

別のJDKをインストールしている場合は上記の結果とならない場合があります。
その際はシステム環境変数の設定を開き、Pathの先頭が

C:\Program Files\Zulu\zulu-11\bin

となるように変更してください。

PostgreSQL 12 インストール

データベースサーバとしてPostgreSQLを使用します。
https://www.enterprisedb.com/downloads/postgres-postgresql-downloads
Windows x86-64 の 12.2 の Download をクリックしダウンロードします。
image.png

ダウンロードしたexeファイルを実行します。
Next をクリックし、インストールフォルダはデフォルトのままで、Next をクリックします。
image.png

コンポーネントもデフォルトのままで、 Next をクリックします。
image.png

データ保管先を指定します。開発用で特に希望がなければデフォルトのまま使用します。Next をクリックします。
image.png

管理ユーザ「postgres」のパスワードを入力します。入力したら Next をクリックします。
image.png

接続ポートを設定します。指定された番号がない限り、デフォルトのまま Next をクリックします。
image.png

ロケールを設定します。「C」を選択し、 Next をクリックします。
image.png

Summaryが表示されますので、Next をクリックします。
image.png

Next をクリックして、インストールを開始します。
image.png

インストールが完了したら下の画面が表示されますので、チェックを外して Finish をクリックします。
image.png

以上でPostgreSQLのインストールは完了です。

payara server 5 インストール

Java EEアプリケーションサーバとして payara serverを使用します。
https://www.payara.fish/software/downloads/all-downloads/
ここではFullをインストールします。
Payara Server 5.201 (Full) Download をクリックすると、zipファイルがダウンロードされます。
image.png

Cドライブ直下にpayaraフォルダを作成し、その中にpayara-5.201フォルダを作成します。
※201の部分は今回のバージョンです
ダウンロードしたファイルを解凍し、解凍後のpayara5 フォルダをpayara-5.201フォルダ内に配置します。配置後の C:\payara\payara-5.201\payara5フォルダの中身は下の画面のようになります。
image.png

次に、payara serverの初期設定を行います。
コマンドプロンプトを起動し、C:\payara\payara-5.201\payara5\binフォルダに移動します。

payara serverを起動します。
asadmin start-domain と入力し、実行します。

c:\payara\payara-5.201\payara5\bin>asadmin start-domain
Waiting for domain1 to start ......................
Successfully started the domain : domain1
domain  Location: C:\payara\payara-5.201\payara5\glassfish\domains\domain1
Log File: C:\payara\payara-5.201\payara5\glassfish\domains\domain1\logs\server.log
Admin Port: 4848
Command start-domain executed successfully.

管理者ログインを行います。
asadmin login と入力し、実行します。
ログインユーザはデフォルトのため空欄とします。
ログインに成功すると、[ユーザフォルダ]\.gfclient\pass ファイルが作成されます。
※パスワード情報が含まれるバイナリファイルです

c:\payara\payara-5.201\payara5\bin>asadmin login
Enter admin user name [Enter to accept default]>
Admin login information for host [localhost] and port [4848] is being overwritten with credentials provided. This is because the --savelogin option was used during create-domain command.
Login information relevant to admin user name [admin] for host [localhost] and admin port [4848] stored at [C:\Users\[ユーザ名]\.gfclient\pass] successfully.
Make sure that this file remains protected. Information stored in this file will be used by administration commands to manage associated domain.
Command login executed successfully.

管理者パスワードを変更します。
asadmin change-admin-password と入力し、実行します。
ユーザ名はデフォルトのため空欄、パスワードは設定していないため空欄のまま進み、新パスワードを入力します。

c:\payara\payara-5.201\payara5\bin>asadmin change-admin-password
Enter admin user name [default: admin]>       ←何も入力せずにEnterキーを押す
Enter the admin password>                     ←何も入力せずにEnterキーを押す
Enter the new admin password>                 ←新パスワードを入力しEnterキーを押す
Enter the new admin password again>           ←新パスワードを入力しEnterキーを押す
Command change-admin-password executed successfully.

再度、管理者ログインを行います。
asadmin login と入力し、実行します。
ログインユーザはデフォルトのため空欄とし、パスワードは先ほど入力した新パスワードを入力します。
ログインに成功すると、[ユーザフォルダ]\.gfclient\pass ファイルが更新されます。

c:\payara\payara-5.201\payara5\bin>asadmin login
Enter admin user name [Enter to accept default]>       ←何も入力せずにEnterキーを押す
Enter admin password>                                  ←新パスワードを入力しEnterキーを押す
Admin login information for host [localhost] and port [4848] is being overwritten with credentials provided. This is because the --savelogin option was used during create-domain command.
Login information relevant to admin user name [admin] for host [localhost] and admin port [4848] stored at [C:\Users\[ユーザ名]\.gfclient\pass] successfully.
Make sure that this file remains protected. Information stored in this file will be used by administration commands to manage associated domain.
Command login executed successfully.

管理コンソールを利用できるようにします。
asadmin enable-secure-admin と入力し、実行します。

c:\payara\payara-5.201\payara5\bin>asadmin enable-secure-admin
You must restart all running servers for the change in secure admin to take effect.
Command enable-secure-admin executed successfully.

再起動を促されますので、payara serverを再起動します。
asadmin restart-domain と入力し、実行します。

c:\payara\payara-5.201\payara5\bin>asadmin restart-domain
Successfully restarted the domain
Command restart-domain executed successfully.

Webブラウザを起動し、http://localhost:8080/ にアクセスし、下の画面が表示されるかを確認します。
image.png

https://localhost:4848/ にアクセスし、管理コンソールのログイン画面が表示されるかを確認します。
image.png

ログイン画面で User Name (上段) に admin 、Password(下段)に先ほど設定したパスワードを入力し、
ログインに成功し下の画面が表示されたらpayara serverのインストールと初期設定は終了です。
image.png

Gradle インストール

最新版をダウンロードします。
https://gradle.org/releases/
リンク先画面の下部にある、v6.2.2の binary-only のリンクをクリックし、zipファイルをダウンロードします。
image.png

Cドライブ直下にgradleフォルダを作成します。
ダウンロードしたファイルを解凍し、解凍フォルダ内のgradle-6.2.2フォルダをgradleフォルダ内に配置します。配置後の c:\gradle\gradle-6.2.2フォルダの中身は下の画面のようになります。
image.png

環境変数を設定します。
Windowsの設定にて「環境変数」と検索し、「システム環境変数を編集」を選択します。
image.png

環境変数 をクリックします。
image.png

システム環境変数の 新規 をクリックします。
image.png

下記のシステム環境変数を設定します。
下表の通り入力し、OK をクリックします。

変数名 変数値
GRADLE_HOME C:\gradle\gradle-6.2.2

image.png

システム環境変数のPathを追加します。
Pathを選択し、編集 をクリックします。
image.png

新規 をクリックし、「%GRADLE_HOME%\bin」と入力し、 OK をクリックします。
image.png

環境変数の編集画面を閉じた後にコマンドプロンプトを起動し、「gradle -version」を実行し下記の結果が表示されればインストール完了です。
image.png

Eclipse インストール・初期設定

こちらも最新版をインストールします。(Java の Full Editionが良いと思います)
http://mergedoc.osdn.jp/

ダウンロードしたzipファイルを解凍し、pleiadesフォルダをCドライブの直下に配置します。
※解凍は7-zipを使用して実施してください。

配置したら、c:\pleiades\eclipse\eclipse.exe をダブルクリックして Eclipse を起動します。

ワークスペースを選択し Eclipse が起動したら、ヘルプ > Eclipse マーケットプレース を選択します。
Eclipse マーケットプレース が起動したら、「payara tools」と入力し Enter キーを押し、検索結果から payara tools をインストールします。
image.png

次のダイアログが表示された場合は、 インストール をクリックします。
image.png

インストール完了後、Eclipseを再起動します。
再起動が完了したら、ウィンドウ > 設定 を開き、 サーバ > ランタイム環境 を選択し、開発サーバの設定を行います。
追加 をクリックします。
image.png

Payara を選択し、次へ をクリックします。

image.png

Payara Location に payara server のインストールフォルダを設定し、JavaロケーションにJDKのインストールフォルダを設定し、完了 をクリックします。その後、適用して閉じる をクリックし、設定ダイアログを閉じます。
image.png

サーバビューを開き、リンクをクリックします。
image.png

Payara > Payara をクリックし、次へ をクリックします。
image.png

パスワードを入力し、完了 をクリックします。
image.png

サーバービュー に Payara Server が追加されます。
image.png

以上で環境構築を終了します。
次章では、プロジェクトの作成作業を行います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【体験記】Java SE 8 Silverに合格しました

9/21に合格したので忘れないうちに体験記を書き残しておきます。

試験結果:
勉強期間: 約4週間
得点率:88%(合格ライン65%)

受けた理由

現在通っている職業訓練校が実施している企業説明会にて、「就職活動をするにあたって持っておいた方がいい資格はなんですか?」と質問すると、どの企業も口を揃えて「JavaSilverを取っているとそれだけで一段抜ける」「あと基本情報技術者試験も」との事だったので、同期から一段抜ける為取得する事に決めました。

受けると決めた時のJava知識

  • Java言語を使用したSES経験あり(研修期間含め4か月で辞める)(現場経験0)(ダメ人間)
  • なんかStrutsとかSpringとかあるんだよね~、DI?なにそれ?
  • 継承、ポリモーフィズム、カプセル化は知ってるつもり、ただポリモーフィズムは実装出来る気がしない。
  • String型がInt型やLong形となんか違うみたいなのは覚えてるとかその程度。
  • ラムダ式?使いたいけど全然分からない…。

勉強方法

恥ずかしながらこれまでまともに勉強をしたことがなかったので、ネットで色々調べた結果、「黒本買って3週くらい問題解いたらいいんだ:smile:」と結論付けて実行することに。

徹底攻略 Java SE 8 Silver 問題集[1Z0-808](通称"黒本")

8/25、黒本がAmazonから届き、慣れていない資格勉強が始まりました。
勉強期間の間は、自宅にて1日1~3章解くことに集中し、1週間の終わりに1度模擬Aを解く。
これを3回繰り返しました。(電車内勉強チャレンジもしてみたのですが、集中できなかったので1回でやめました)

模擬Aの点数

  • 1週目模擬A:45/77
    1週目の時は色んなところからボコボコにされて、「自分はJavaのことを知ってるようで全く知ってなかったんだなぁ」と思い知らされてしまいました。
    若干凹みつつ、1週目に理解出来なかった問題を解けるように注目しながら2週目に取り掛かりました。

  • 2週目模擬A:57/77
    あまり点数は伸びませんでしたが、苦手だった問題が解けていたので「このまま勉強してればいけるのでは?」となんとなーく思っていました。
    若干喜びつつ、今度は全体的な復習を意識しながら3週目に取り掛かりました。

  • 3週目模擬A:65/77
    凄くいけるような気がしてきたので、ここで1週間後に受験申し込みをすることに。
    面倒な申し込みをクリアしつつ、残り1週間はとにかく模擬A・Bを解きまくることに専念していました。

最終的な模擬の点数
* 4週目模擬A:69/77
* 模擬B:65/77

根拠はありませんが、もう行ける気しかしません。(のんき)

試験当日

張り切りすぎて開始1時間前に試験会場に到着し、近くのドトールで30分ずっと黒本とにらめっこしていました。
30分前に試験会場に入り、受付を済まし顔写真を撮られ、椅子に座って待っていました、この時の気分は処刑を待つ受刑者でした、怖かった。

肝心な試験の内容は、噂通り黒本模擬A・Bの問題と酷似したものが多数を占めていました。

試験終了後、10分で結果がメールで届きました。
得点率:88%(合格ライン65%)で合格でした、まさかのガッツポーズが出ました。

間違えた内容

  • superとthisを使用したコンストラクタのアクセス
  • whileループについて
  • コンストラクタの作成およびオーバーロード
  • 多態性の使用方法
  • 文字列の作成と操作

今見ても理解は出来ているので、結構凡ミスが多かったようです。
これを見ているJava Silverを受験する方は注意してくださいね(?)

まとめ

結局、一番ネックなのは受験料でした。26,600円はつらい…:sob:
しかし、自分みたいなJava歴1年未満でも3週間勉強していれば取れるくらいなので、お金に余裕がある方は是非取ることをお勧めします、特にJavaを覚えて就職活動をする予定の方は特にお勧めします。
次の目標は基本情報技術者試験です、ガンバルゾー。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Android studio-Fragmentに関して

Fragmentに関して昔の教則動画を見たら、またいろいろと更新されたようで、ここで記録しておきます。

Import fragment package 

package com.example.fragment;

import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class TopSectionFragment extends Fragment{

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //convert xml file to View object; parent=parameter ViewGroup container of the method
        //you can use layoutInflater directly with the parameter of inflater
        View view=inflater.inflate(R.layout.top_section_fragment,container,false);
        return super.onCreateView(inflater, container, savedInstanceState);
    }
}

まずFragmentのインポートルートは上記になりました。
Androidxに移転したSupport系のパッケージはこちらのリンクで調べてみてください。
https://developer.android.com/jetpack/androidx/migrate/artifact-mappings

Androidxへの乗り換えに関しました。下記リンクで説明が見られます。
https://developer.android.com/jetpack/androidx/migrate

FragmentをActvityでpreviewしたい場合

Android studio 3.x verから直接Fragmentをプレビューできなくなったようで、
Actvityのxmlにtools:layout=を入れないといけません。

 <!--adding tools:layout=@layout/fragmentXmlFileName to preview the fragment-->

    <fragment
        android:id="@+id/fragment3"
        android:name="com.example.fragment.TopSectionFragment"
        android:layout_width="350dp"
        android:layout_height="200dp"
        android:layout_marginStart="28dp"
        android:layout_marginTop="16dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout="@layout/top_section_fragment" />

以上は覚書です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Javaで税率を返すメソッドを作成する

消費税率が 8% から 10% になりました。

税率は

  public static final double TAX_PERCENT = 0.08;

みたいに定数として持たせると危険です。

2014年04月 8%
2019年10月 10%

のようにして税率は変わってきており、今後も増税のタイミングが発生することが予想されます。

このように日時によって税率が変わるため、以下のように税率を返すメソッドを用意するのがおすすめです。

  public static final double EIGHT_TAX_PERCENT = 0.08;

  public static final double TEN_TAX_PERCENT = 0.10;

  public static final String TEN_TAX_PERCENT_CHANGE_DAY = "2019-10-01 00:00:00";



  public static double getTaxPercent() {
    try {
      Date now = new Date();
      SimpleDateFormat sdformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      Date dateTime = sdformat.parse(TEN_TAX_PERCENT_CHANGE_DAY);
      return now.getTime() >= dateTime.getTime() ? TEN_TAX_PERCENT : EIGHT_TAX_PERCENT;
    } catch (ParseException e) {
      System.out.println(e);
    }
    // きっと永遠にこない
    return 0;
  }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む