2023/5/10(水)に開催されたTechFeed Experts Night#18での登壇資料です。 https://techfeed.io/events/techfeed-experts-night-18
まえがき ずっとJava11を使っていました。そのためすっかりラムダ式やStreamAPIでの書き方に慣れていたのですが、最近Java7を使って稼働しているプロジェクトに異動したので、何ができて何ができないのか、ちょっと調べてみました。 Javaの変遷 私見ですが主要だと思う仕様変更を並べてみました。アプリ実装に関係する部分のみピックアップしています。 このバージョンのこれは入れておいたほうが良いよ!との意見がありましたらコメントにぜひお願いします。 Java8 2014/03/18 正式リリース(GA) https://openjdk.java.net/projects/jdk8/ ラムダ式 https://openjdk.java.net/projects/lambda/ https://qiita.com/sano1202/items/64593e8e981e8d6439d3 pub
log4jとはJava用のloggingライブラリだ。loggingライブラリというのはログとして記録すべき文字列を受け取り、それをどこかに出力するものだ。文字列の中身を通常のloggingライブラリは気にしない。 log4jが通常のloggingライブラリと違うのは、文字列の中身を見て、一部の文字列を変数とみなして置換することだ。これはlog4jのドキュメントではlookupと呼ばれている。 Log4j – Log4j 2 Lookups 例えばプログラムを実行中のJava runtimeのバージョンをログに含めたい場合は、"Java Runtime: ${java:runtime}"などとすると、"Java Runtgime: Java(TM) SE Runtime Environment (build 1.7.0_67-b01) from Oracle Corporation"などの
このエントリでは、Yegor Bugayenkoによる記事、Seven Virtues of a Good Objectを紹介する。 (Yegorから和訳と転載の許可は得た。) 以下はその全文の和訳だが、意訳超訳が混じっているので、もとのニュアンスを知りたければ元記事を読んでもいいし、読まなくてもいい。 Martin Fowler曰く、 ライブラリは本質的には呼び出し可能な関数の集合で、最近は普通クラス内にまとめられる。 クラス内にまとめられた関数? 失礼を承知で言わせてもらうが、これは間違っている。 そして、これはオブジェクト指向プログラミングにおいて、クラスに対する非常に一般的な誤解だ。 クラスは関数をまとめるものではないし、オブジェクトはデータ構造体ではない。 では、なにが適切なオブジェクトなのか? どれが不適切なオブジェクトなのか? その違いは何か? これは論争を呼ぶ主題ではあるが
Modern JVM languages such as Kotlin, Groovy, Scala and some others offer many language features that let you write code in a more concise and expressive manner. These features include type inference, properties, interpolated string, range and tuple literals, enhanced operators, clojures, implicits, smart casts, and many more. Even Java (which always used to be very conservative and with good reaso
異なる型のオブジェクトの順序比較が今回のテーマ。 Javaの場合、オブジェクトの順序を比較する王道はふたつある。 ひとつはjava.lang.Comparable *1(こんぺあらぶる)を実装する「自然順序付け」と呼ばれる方法。 public class A implements Comparable<A> { int a; @Override public int compareTo(A o) { return this.a - o.a; } } もうひとつはjava.util.Comparator (こんぱれーたー)を用いる方法。*2 public class MyComparator implements Comparator<A> { @Override public int compare(A o1, A o2) { return o1.a - o2.a; } } 見て分かるよう
JDK9から導入されるJShell、IDEに組み込めれば最強だと思ってたのが、NetBeansで試せるようになっていました。 ずいぶん前にNetBeansにJShellを組み込む話が出てたのに、一向に開発ビルドに載ってこないと思ってたら、プラグインとして独立して開発されていました。 まず、次のHudsonサイトからupdate.xmlのURLをコピーします。 prototypes-repl9 [Hudson] これです。 http://deadlock.netbeans.org/job/prototypes-repl9/lastSuccessfulBuild/artifact/nbbuild/nbms/updates.xml プラグインダイアログの、「設定」タブで「追加」ボタンを押して、「アップデート・センター・カスタマイザ」を開きます。 適当な名前をつけて、「URL」にさきほどのupda
Apache commons とか Apache HttpClient みたいなJavaのライブラリをちょっと試してみたい時に、IDEでプロジェクトをいちいち用意して、Javaのコードを書くのが面倒だったりする。 Java SE 8には、Nashorn (なすほーん) というJavaScriptエンジンが搭載されていて、Javaライブラリを利用するJavaScriptプログラムを動かすことができる。JavaScriptに馴染み深い自分からすれば、ありがたい。 ただ、素のままでは「jarを取ってきて、クラスパスを設定して」という作業を手でおこなう必要があって、これまた面倒。これを解決する方法のひとつがNasven( GitHub - nasven/nasven: Nasven.js core code )。Maven artifactの依存関係を記述して、依存ライブラリの取得、クラスパスの設
驚きですね。なんと、 window.setBackground(new Color(0,0,0,0)); で背景が透明なウィンドウが作れるようになってました。jre1.6ならcom.sun.awt.AWTUtilitiesのsetWindowOpaqueでなんかなぁ、的な感じで透過していたのに。 そのほか、ウィンドウ全体の不透明度を設定するWindow.setOpacity(float)、ウィンドウの形を変更できるWindow.setShape(Shape)が使えるようになっています。 Java7でSwingの改善と言えばJLayerぐらい、というイメージですが、こんな微妙だけど、使いにくかった場所が整備されてるんですね。 あと、カラーチューザーに待望のHSV形式が追加されたましたよ。細けぇ。 背景透明化の実行結果例とコードの例です。(結果画像は実行環境を変えただけで、ソースは弄っていませ
テキストデータを読み込む場合、言語にかかわらず1行ずつ読み込んで処理します。ここではこのイディオムを"read-lines"と呼ぶことにします。 スクリプト言語なんかだと大抵、最初からforeachで済んでしまっていたりしますが、初期のJavaではちょっと面倒な手順が必要でした。 新しいバージョンではだいぶ簡単簡潔に書けるようになりましたが、今度はたくさんありすぎて、どれがなんなのかが良くわからなくなっています(大袈裟)。 そこで今回は、"read-lines"の変遷についてまとめてみました。 最近Javaを始めた方がバージョンが古い時に書かれたソースコードを読むときに役に立つ...かも知れません。 目次 基本 BufferedReader (Java1.1~) Scannerと拡張for文 (Java5~) java.nio.file.Filesとtry-with-resources(J
Javaでのプログラムでは、Optionalが入ったとはいえ、nullとのつきあいは依然として重要です。 そんな中で、nullが入ってると困る処理を書くときには、nullチェックを行うほうが安全です。 そのとき、どのようにnullチェックを行うかというのが問題になります。 Java7からは、Objects.requiredNonNullというメソッドが導入されたので、このメソッドを使って、以降の処理でnullじゃないことを保証するということができます。 けど、このrequiredNonNullが遅いんじゃないかという話があるので、どう遅いのか調べてみました。 requireNonNullと同様に、値がnullだったらNullPointerExceptionを吐いて、null以外だったら素通りするという書き方のひとつに、getClassメソッドを呼び出すというものがあるので、これと比べてみま
今回はJavaの型システムのコンストラクタについて考えてみたい。 Javaの型システム、あるいはJavaのオブジェクト指向において、コンストラクタという存在は特殊な存在だ。 コンストラクタ内からはそのクラスのインスタンスフィールドにアクセスできる。これは通常のインスタンスメソッドと同等のスコープであってstaticメソッドのそれとは異なる。しかし、コンストラクタを呼び出すにあたってはインスタンスのメソッドという体ではなく、staticメソッドのように(インスタンスではなく)クラスに属するものとして呼び出すことになる。(もっともnewという専用のキーワードを用いるのでそうは見えないかもしれないが) クラスやinterface、つまりJavaの「型」によるポリモフィズムの世界を考えるとき、コンストラクタはのけものである。継承関係を持つクラスであってもコンストラクタは継承されないし、オーバーライ
このページは、Java Collections Framework の設計に関するよくある質問とその回答です。質問と回答は、collections-comments エイリアス上の膨大なトラフィックから選出しました。Collections Framework の設計原理として参考にできます。 コアインタフェース - 一般的な質問 省略可能な操作 (および UnsupportedOperationException 例外) を排除できるように、コアコレクションで不変性を直接サポートしてはどうでしょうか。 UnsupportedOperationException を発行する場合、省略可能な操作を呼び出すコードを try-catch ブロックの中に入れる必要はないのですか。 「バッグ」(マルチセットとも呼ぶ) のためのコアインタフェースがないのはなぜですか。 一貫性を得るために「Beans 方
弊社の技術情報をご紹介いたします。 実際に行った設定やログ、ノウハウ等の資料を掲載しております。 リンクは自由ですが、他媒体物などでの再配布はお断り致します。 登録商標、著作権などで疑義ありと思われる方は弊社までご連絡ください。
lombokは、JavaでのアクセッサやtoString、equalsなどボイラープレートなコードをコンパイル時に生成してくれるライブラリです。 ただ、こういったコードの生成は、IDEを使えば自動で行えるので、わざわざlombokを導入するまでもないと考えることもできますが、ぼくはlombokを導入するべきだと考えて、lombokを使うようにしました。 このとき「lombokを導入するべき」と考えた理由を書いておきます。 lombokとは lombokは冒頭でも書いたように、Javaのアクセッサなどを生成してくれるライブラリです。 Project Lombok import lombok.*; @Setter @Getter @AllArgsConstructor @NoArgsConstructor @ToString public class LombokSample { privat
Javaのクラス宣言には5種類ある。 トップレベルクラス・ネストしたクラス・内部クラス・ローカル内部クラス・匿名クラス(無名クラスとも言われる)の5種類だ。 今回はこの5種類のクラス宣言のおさらい。 トップレベルクラス これは普段使っているクラス。拡張子が.javaのファイルを作り、そのファイル名とクラス名を合致させなくてはいけない。そのjavaファイルのトップレベルに位置する。 ネストしたクラス 「ネストしたクラス」(Nested class)とはクラスの中にクラスがネストしている状態。トップレベルクラスの内側にstaticキーワードをつけてクラス宣言を行う。 public class Outer { public static class Nested { } } このネストしたクラスは、トップレベルクラスと同等の機能性を持つ。 クラス名はOuter.Nestedという名前で扱われるが
「君のプログラミング言語で、これ、できる?」で紹介されていた「Execution in the Kingdom of Nouns」を訳してみました。英語よりも、つたない日本語訳の方がよい方は、どうぞ。 おかしな訳があれば、教えて下さい。適宜、訂正します。 「C の関数はファーストクラスじゃないよ」などの突っ込みは、原文の著者へどうぞ。 名詞の王国での実行 彼らには気分ってものがある。ものによるが...特に動詞がそうだ。誇り高いことったらない...形容詞相手ならなんとでもできるが、動詞はどうしようもない...じゃが、このわしにかかれば皆思いのまま! -- ハンプティ・ダンプティ 世界のみなさん、こんにちは!今日は、邪悪な王 Java の物語と国中の動詞を滅ぼした彼の冒険について語ろう。 警告:この物語は幸福な結末を迎えない。心臓の弱い人や批判家向けではない。もし、あなたが怒りっぽい性格である
このプログラムでは全体の処理の流れが決まっています. その中で,youGotMailPopup()の部分のみの動作が変更できることが望まれています. ここで利用できるパターンを考えてみます.振舞に分類されるパターンのなか で,TemplateMethod と呼ばれるパターンがあります.GoFを参照すると, TemplateMethod 目的: 1つのオペレーションにアルゴリズムのスケルトンを定義しておき,そ の中のいくつかのステップについてはサブクラスでの定義に任せることにする. TemplateMethodパターンでは,アルゴリズムの構造を変えずに,アルゴリズ ムの中のあるステップをサブクラスで再定義する. とあります.今回の例では,全体の処理の流れを規定するrun()メソッドが上 記の「スケルトン」に当たります.また,youGotMailPopup()が「いくつかの ステップ」に当ては
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く