%s に null を渡したらどうなるんだっけ
こたえ
文字列 null が出力される。
コード
final String text = null;
System.out.printf("%s", text);
参考
For category General, Character, Numberic, Integral and Date/Time conversion, unless otherwise specified, if the argument arg is null, then the result is “null”.
リンク先の表にある通り、 s はカテゴリ"general"に属す。ちなみに日本語ではこうなっている(わかりにくい):
DateTimeFormatter とかこれもうわかんねぇな
コード
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class App {
private static String format(final LocalDate date, final String pattern) {
return date.format(DateTimeFormatter.ofPattern(pattern, Locale.JAPAN));
}
public static void main(final String[] args) {
final LocalDate today = LocalDate.of(2019, 6, 4);
System.out.println(format(today, "M"));
System.out.println(format(today, "MM"));
System.out.println(format(today, "MMM"));
System.out.println(format(today, "MMMM"));
System.out.println(format(today, "MMMMM"));
System.out.println(format(today, "MMMMMM"));
}
}
結果
| パターン | 結果 |
|---|---|
| M | 6 |
| MM | 06 |
| MMM | 6 月 |
| MMMM | 6 月 |
| MMMMM | 6 |
| MMMMMM | IllegalArgumentException: Too many pattern letters: M |
$ java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
参考(にならなかった)リンク
参考(にややなった)リンク
関連(しない)
…Spring Bootで コンポーネント外からコンポーネントを取得したかった
動機
CDI で言うところの CDI.current().getBeans(...) とか CDI.current().select(...)とかそんな感じのことをやりたかった。
参考リファレンス
ドキュメントでは、やりたいことが書いてあるように見えたのはこのセクション
…Spring Boot 2.1 でテスト時 @Bean を挿げ替えたかった
動機
ユニットテスト実行時に java.time.Clock を特定の時間に固定して再現性のあるテスト(現在の時刻に依存しないテスト)を作成したかった。
考え方/方針
@Configuration で @Bean を定義して Clock をインジェクションできるようにし、実装ではそれを用いる。
text/plain で JSON を投げつけてくるヤツに対処する
の別解。
@Autowired
private RestTemplateBuilder builder;
...
final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_PLAIN));
final RestTemplate restTemplate = builder.additionalMessageConverters(converter).build();
ちなみに上記のようにコンバータを明示的に設定しない場合だと次のような例外になる :
…Java9以降.propertiesファイルをUTF-8で書けるようになった、は正しい?
解答
正しくない。
- Java9(JEP226)で変わったのはリソースバンドルの取り扱い(PropertyResourceBundle) であって プロパティファイル
.properties全般の話ではない。 - プロパティファイル
.propertiesの文字エンコーディングについての取り決めはない。それを取り扱うプログラム次第でありUTF-8を正しく認識してくれるとは限らない。- 標準 API で
UTF-8として(読もうと思えば)読めるようになったのは 1.6 からであって 9 からではない。ちなみに 1.5 以前はISO 8859-1前提。
- 標準 API で
背景
私はうろ覚えで何となく、現在の Java では .properties ファイルを UTF-8 で書ける、ascii2nativeは過去の遺物になった、のだと思いこんでいました。
ところが Spring Boot の application.properties に UTF-8 で日本語を書いたところ文字化けしてしまい、あれ、もしかして自分の理解が間違っているのかと思い調べ直したのがこの記事です。
Testing the Web Layer のコードを JUnit Jupiter にマイグレーションしてみる
概要
(追記: ここで試したのは2.1.4.RELEASE時点のもの。2.2.0.M3以降では #14736の通り JUnit5 がデフォルトになっている模様。)
spring-boot-starter-test の JUnit5 対応はこちらの issue:
…Spring Validator(でラップされたBean Validation)のメッセージをi18nしたときの覚え書き
やりたかったこと
- BeanValidation のプロパティファイル
ValidationMessages.propertiesでなく、 Spring のメッセージプロパティに統合したい。- Spring のメッセージプロパティとは?
Accept-Languageベースでメッセージを国際化したい。
調べた
Spring のメッセージプロパティファイルはどこ?
これはキーワード “site:spring.io i18n message” でググるとすぐ見つかった。
…RPGツクールMVをバージョン管理するための初期設定
他の方が同じ話題で次のエントリを書かれていましたが、gulp 何それ状態なので理解できませんでした。理解できる方はそちらの方が良いのかもしれません。
…Hibernate で CHAR を String にマップする
例えば、生 JDBC でchar型カラムのクエリを書くとString型にマップされます
final Connection connection = DriverManager.getConnection(...);
final Statement statement = connection.createStatement();
final ResultSet resultSet = statement.executeQuery("select char_column from foo_table");
// java.lang.String
resultSet.getMetaData().getColumnClassName(1);
が、Hibernate の Native query を用いて同じように実行するとCharacter型にマップされます:
Eclipseの起動に使用するJDKを指定する(Mac)
最新の JDK をインストールしたが、古いバージョンの Eclipse も利用したい(が最新のバージョンでは起動できない)ような場合に必要となる設定です。
設定するファイルと設定方法
Eclipse.app/Contents/Eclipse にある eclipse.ini に、所望のバージョンの java コマンドが入っているディレクトリを指定します。
/usr/libexec/java_home -V で JAVA_HOME 候補一覧が参照できますので、このディレクトリ + /bin を指定することになります。
Ubuntu18.04 端末の不快なエラー音 消す方法
Ubuntu を 18.04 にアップグレードしたら端末の補完処理で tab キーを押す度にヴヴッという不快なビープ音が鳴るようになってしまった。
端末のメニューから 設定 を選択し設定ダイアログを開く。
ダイアログで自分の使用しているプロファイル(ここではデフォルト)を選択し、文字タブのSoundオプションで端末ベルを鳴らすのチェックを外せば OK。
OpenJDK11をWindowsで自前ビルドする
Java の有償化ってより身近なところでは GPL 化と言った方が現状に即してるな、と思っています。
それはともかく、何となく OpenJDK をデバッグ情報付きでビルドしたくなったのでメモ。
…