タグ

JavaとProgrammingに関するteracy_junkのブックマーク (94)

  • 標準出力もプログラムの動作を致命的に変えるという話 - Qiita

    正常に動作しないスクリプトやプログラムに標準出力処理(echoやSystem.out.print()など)を追加して、デバッグした経験は誰にでもあるのではないでしょうか。標準出力処理の追加は、簡単なプログラムの動作検証から制限などによりデバッガーを使用できない環境での調査まで、いろいろな場面で活用されていると思います。 しかし、1行の標準出力処理の追加でもプログラムの動作を致命的に変える可能性はあります。 過去に、echoが原因でバッチが停止した問題の対策のために、JavaのプログラムにSystem.out.println(・・・);の1行を追加した結果、アプリケーションが応答を返せなくなったことがありました。その時の記憶を、サンプルプログラムを交えながら説明したいと思います。 年次バッチが停止した! 10年ほど前のある日、あるシステムの保守を担当していた私のもとに「年次バッチが停止してし

    標準出力もプログラムの動作を致命的に変えるという話 - Qiita
    teracy_junk
    teracy_junk 2019/02/01
    これ直面したら泣く自信ある
  • Java Generics Hell - リスコフの置換原則 - プログラマーの脳みそ

    Java Generics Hell アドベントカレンダー 3日目。 1日目 Java Generics Hell 序章 2日目 オブジェクト指向 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。 前回はオブジェクト指向の中核が(継承に限定せず幅広い意味での)ポリモーフィズムではないか、という話であった。 今回はそれらをコンパイル、つまり静的型チェックによって安全を目指す「型システム」について。その中でも「リスコフの置換原則」について取り上げる。 ヒューマンエラー ボイラープレートと呼ばれるプログラミングの定型句ぐらいであれば機械による自動生成もありうるが、プログラミングというのは現代では基的に人力の作業である。 人間は簡単な問題であってもときおり誤りをおかす。一桁の足し算のようなドリルでも、延々とやらせると時折ミスが混ざる。「簡単だからミスするはずがない」「ミスをす

    Java Generics Hell - リスコフの置換原則 - プログラマーの脳みそ
  • Effective Java 16章「継承よりコンポジションを選ぶ」 - Qiita

    InstrumentedHashSet<String> s = new InstrumentedHashSet<String>(); s.addAll(Arrays.asList("AAA", "BBB", "CCC"); System.out.println(s.getAddCount()); このとき、s.getAddCount()は6を返す。要素を3つしか追加していないのに何故か? その理由はHashSetが内部的にaddを呼び出しているから。add()とaddCount()で二重にaddCountが加算されている。 このInstrumentedHashSetを正しく動作させる為には、HashSetのaddAllメソッドがallメソッドを使用しているという事実を実装者が知っている必要がある。サブクラスとスーパークラスの実装が同じプログラマの管理下であれば安全だが、そうでない場合は脆い

    Effective Java 16章「継承よりコンポジションを選ぶ」 - Qiita
  • "ふつうのJavaコーディング"を話しました - 日々常々

    2017/5/20にあったJJUG CCC 2017 Springで登壇させていただきました。 8回目の参加です。 毎回パワーアップしているなーと言うのは前回のブログでも書きましたが、今回は目に見えて参加人数が増えたんだなーと体感しました。 入れないセッションもありましたし、懇親会も超満員でした。運営の皆様に当に感謝です。 今後も楽しみにしています。 話したもの ごくふつうの話、のつもり。ふつうって一体なんだとか思わなくはないですが、ただの枕詞なので意味はないです。 結局のところ九段に集約されるんですが、強い意思を持つには色々必要で、まあそんな感じです。 「coming soon」となっている61スライド目 先日(6/24)発売のWEB+DB PRESS Vol.99 で書いてます。 WEB+DB PRESS Vol.99 作者: ?橋健一,谷口禎英,井大登,山崎勝平,大和田純,内村元

    "ふつうのJavaコーディング"を話しました - 日々常々
    teracy_junk
    teracy_junk 2017/06/29
    ふつうだけどふつうにできてないなぁと痛感
  • あっと驚かせるJavaプログラミング(をやめよう) - Qiita

    はじめに 驚き最小の原則(法則)という言葉があります。 Wikipediaの記事を引用すると http://ja.wikipedia.org/wiki/%E9%A9%9A%E3%81%8D%E6%9C%80%E5%B0%8F%E3%81%AE%E5%8E%9F%E5%89%87 ユーザインタフェースやプログラミング言語の設計および人間工学において、インタフェースの2つの要素が互いに矛盾あるいは不明瞭だったときに、その動作としては人間のユーザやプログラマが最も自然に思える(驚きが少ない)ものを選択すべきだとする考え方である。 要するに、使うときに「おやっ?」という驚きが少ないほうが良いプログラムであるといえます1。 この記事では敢えて驚きの多いプログラムの書き方を紹介します。驚きの多いプログラムを読むとどんな気分になるか、実際に体験してみてください。もちろん、当は驚きが少ないプログラムを書

    あっと驚かせるJavaプログラミング(をやめよう) - Qiita
    teracy_junk
    teracy_junk 2017/06/14
    笑った(笑えない)
  • Arrays.asList() は単なる配列のラッパを返すだけなので、要素の追加も削除もできません - A Memorandum

    いつまでたっても間違いが無くなりません。 以下のようにListの初期化で多用するArrays.asList()。 List<String> stooges = Arrays.asList("Larry", "Moe", "Curly"); Arrays.asList() が返すインスタンスは、java.util.Arrays$ArrayList であって、java.util.ArrayList ではありません。 Arrays.asList() の実装は以下のようになっています。 public class Arrays { public static <T> List<T> asList(T... a) { return new ArrayList<>(a); } } 分かりにくいですが、ここでインスタンス化される ArrayList は Arrays の内部クラスで以下のクラスです。 pu

    Arrays.asList() は単なる配列のラッパを返すだけなので、要素の追加も削除もできません - A Memorandum
  • Weak Referencesから学ぶJavaにおけるオブジェクトの4種類の参照 - リア充爆発日記

    各種ドキュメント等を見ていたらWeakReferenceクラスなるものを見つけた。 http://developer.android.com/reference/java/lang/ref/WeakReference.html これを読んでも英語力のせいか何を言っているのかよくわからなかったけど、メモリ消費の話に繋がることはわかったので、Androidアプリには重要なはずや!と思ってもっと調べて見ることにした。 ちなみに現時点での総Java歴1年そこそこの僕のJavaの「参照」の認識としては"GC絡みで出てくる話で、そのオブジェクトが別のどのオブジェクトからも参照されなくなったらGCの対象になる" といった程度。 信頼と実績のSOを経てたどり着いたのはこちら。 Understanding Weak References するとJavaの「参照」は4種類もあるらしい。。。知らんかった。こうい

    Weak Referencesから学ぶJavaにおけるオブジェクトの4種類の参照 - リア充爆発日記
  • 作って理解するDIコンテナ - きしだのHatena

    DIコンテナ使ってるけど、アノテーションってなんなの!って聞かれて、作ってみたらわかるよと答えてみたので、自分でも作ってみました。 よくわかった。 「DIコンテナ使うと何がいいの?」ということも、作ってみるとわかります。あと「DIって何がいいの?」に関しては、「DIはちょっとコードを書くのが楽になるだけで、それだけあっても仕方ない、大事なのはコンテナ」と答えるようにしてますが、コード比率からもそれがよくわかります。 続編としてWebフレームワークも作っているので参考まで。 作って理解するWebフレームワーク - きしだのHatena まずはコンテナを作る とりあえず1ソースの状態で。 こんな感じで、管理する型を登録できるようにします。 static Map<String, Class> types = new HashMap<>(); static void register(String

    作って理解するDIコンテナ - きしだのHatena
  • Android Javaでフィールドにmプレフィクスをつけるのはやめよう - Islands in the byte stream

    Android Javaでは昔からAOSPのcoding style guidelineに則ったスタイルがとられることが多いようです。そのなかで、private fieldに "m" (member) や "s" (static member) などのプレフィクスをつけよ、というものがあります。 AOSP Java Code Style for Contributors  |  Android Open Source Project これはいわゆるハンガリアン記法の変種で、こういうやつですね。 class Recipe { private String mTitle; private List<String> mSteps; // ... } これについての態度はプロジェクトごとに様々ですが、たとえばクックパッド社のJavaのスタイルガイドでは明確に否定しています。 styleguide/

    Android Javaでフィールドにmプレフィクスをつけるのはやめよう - Islands in the byte stream
  • ちょっといいJavaコードを書こう - Qiita

    一人でプログラムを書いてたりすると、環境によってはあまりコードの書き方には指摘を受けなくて困りますよね。プロになっても、曲がりなりにもちゃんと動くコードを書けてしまうとあまりに当たり前のことなんかは指摘されることも稀で、そのままある程度偉くなっちゃった日には、もはや自分で気付くしかなくなってしまいます。 FindBugsとか、Effective Javaなら使ったり読んでみたり読ませたりすることはできますが、それ以前のところって難しいんですよね。よいコードと言うよりそれが当たり前だと思われているので、指摘するにしても「こうすればいいよ」(アドバイス)じゃなくて「なんでこうしてないの?」(詰問)になってしまいがちです。 そこで、最近そういうJavaニュービーに指摘している(したい)ことの多い、Javaの基礎的な事柄をまとめてみました。ワタシJavaチョットデキルって人は、これ以外にもやりがち

    ちょっといいJavaコードを書こう - Qiita
  • Javaのログ出力: 道具と考え方

    2.  @miyakawa_taku  JJUG幹事  SI屋で賃労働  尾上部屋の里山関のファンです  オレオレJVM言語Kinkを作っています https://bitbucket.org/kink/kink 自己紹介 #jjug 2/67 3. #jjugログとは! 例: $ kink -Vdebug -e '' 2015-10-04 15:58:29 [main] DEBUG BoxingValues - use box proto listener org.kink_lang.kink.internal.eval.VarAssignEvaluator$VarAssignListener@3af49f1c 2015-10-04 15:58:29 [main] DEBUG BoxingValues - use box proto listener org.kink_lang.

    Javaのログ出力: 道具と考え方
  • GoFの23のデザインパターンを,Javaで活用するための一覧表 (パターンごとの要約コメント付き) - 主に言語とシステム開発に関して

    GoFデザインパターンの一覧表と,活用のためのコメント,および入門者が独学するためのリンク集(サンプルコード付き)。 入門者の独学を支援するために,このページのURLを提示して熟読させ,各パターンを短時間で効率よく学んでもらう。 デザインパターンはプログラマの常識だ。 Java使いかどうかは問わない。 にも関わらず,入門書を買ったまま,途中で挫折する人が多い。 挫折の原因は,パターンの数が23もあって,多いからだろう。 全パターンをすんなり覚えてもらうためには,各パターンごとに 「要するにこういう目的のパターンなんだ。」 「10文字で表現すると,パターンの意味はこうなんだ。」 という要点・質を,短いコメントで伝えれば助けになるだろう。 こういった学習を通して,Java言語の「設計思想」も併せて感じ取ってゆけるはず。 全パターンの一覧表(要約コメント付き) 全パターンについて,10文字以内

    GoFの23のデザインパターンを,Javaで活用するための一覧表 (パターンごとの要約コメント付き) - 主に言語とシステム開発に関して
  • package-private を明示するのはありかもしれない - Qiita

    Help us understand the problem. What is going on with this article?

    package-private を明示するのはありかもしれない - Qiita
  • 第20回 #potatotips でJavaのenumについて語ってきた - Augmented Usamimi

    表題のとおりです. potatotips #20でLTした 前回(第19回,発表資料)は当日繰り上がり当選,その前(第17回,発表資料)は主催者枠での登壇だったので,正規当選での発表は実は初めてだった. speakerdeck.com Effective Java 第2版 (The Java Series)とKeithYokoma氏のQiita記事に自分が最近書いたコードからの知見を加えたもだが, スライドのデザインに気を取られすぎて内容がアレになってしまった. あと,最近のAndroid界隈の流行に乗ってスライドを英語で作ったらとてもつらいことになった. トークから漏れたenumの話 スライド後半でenumで実装するイベントハンドラを紹介している. これはスライドに書いたとおりだけど,大きなメリットとしてはやはりテスタビリティの向上と責務の分散があると思っている. テスタビリティについて

    第20回 #potatotips でJavaのenumについて語ってきた - Augmented Usamimi
  • 値渡しと参照渡し (と参照の値渡し) - ぐるぐる~

    値渡しと参照渡しは、分かってしまえば何も難しいところはないんだけど、分かるまでにちょっとした壁があるというかなんとうか・・・ てことでちょっとまとめておきますねー 値渡し (call-by-value) と参照渡し (call-by-reference) の違い 値渡しと参照渡しの違いは、「呼出し元の値自体を変更できるかどうか」と説明されることが多い。 しかし、例えば Java ではミュータブルなオブジェクト *1 を渡した場合、呼出し元の値自体を変更できるという勘違いをする可能性があるため、この説明はあまり好ましくない。 そのため、参照渡しを「呼出し元の別名を渡している」と覚えるのが分かりやすいと思う。 値渡しは「何かの値をコピーして渡している」と覚える*2。 Java の場合 Java には値渡ししか存在しないが、「参照型」のためにややこしく感じる。 参照型は参照渡しとは無関係で、C

    値渡しと参照渡し (と参照の値渡し) - ぐるぐる~
  • Arrays.asList の罠 - Qiita

    // コンパイルエラー int[] array = {0, 1}; List<Integer> list = Arrays.asList(array); int[] array = {0, 1}; List<Integer> list = new ArrayList<Integer>(array.length); for (int i = 0; i < array.length; i++) { list.add(array[i]); } 何とも悩ましい。 原因 Arrays.asList は、プリミティブ型の配列をリスト化してくれない。 いや、正確にはリスト化はしてくれるものの、プリミティブ型の配列全体を単一の要素として扱うため極めて直感と異なる動作をする。 参照:http://aoking.hatenablog.jp/entry/20110415/1302824606 ということらしい。

    Arrays.asList の罠 - Qiita
  • 型パラメーターへのキャストは絶対に行ってはいけない - にょきにょきブログ

    Java | 08:56通常、ジェネリクスで型指定されたコレクションには指定された型のインスタンスしか格納されない。例えば以下のコードで表される list には Integer クラスのインスタンスしか格納されない。 List list = new ArrayList(); 上記の list に対して以下のコードを書くとコンパイルエラーとなる。 list.add( "not a number" ); しかし、キャストを行うことでコンパイルエラーは回避できる。 list.add( (Integer)"not a number" ); このキャストでコンパイルエラーが回避できる性質を利用すると、ジェネリクスを用いた型安全性は脆くも崩壊する。上記コード例では Integer へキャストを行っていたが、この Integer を型パラメーターにし、型パラメーターへのキャストを行うことでジェネリクスを

  • Javaのinstanceof演算子 - とあるソフトウェア開発者のブログ

    Javaのinstanceof演算子に関するメモです。 instanceofの基 instanceof演算子の演算結果は、左辺のオブジェクトが以下の条件のどれかを満たす場合にtrueとなります。 右辺に指定したクラスのオブジェクトである。 右辺に指定したクラスのサブクラスのオブジェクトである。 右辺に指定したインターフェースの実装クラスである。 右辺に指定したインターフェースの実装クラスのサブクラスである。 instanceof演算子の演算結果がtrueになった場合、左辺のオブジェクトを右辺のクラスにキャストし、メンバにアクセスすることが可能です。 テスト用のコード import java.io.Serializable; public class InstanceOfTest1 { public static void main(String[] args) { /* * Number

    Javaのinstanceof演算子 - とあるソフトウェア開発者のブログ
    teracy_junk
    teracy_junk 2015/06/08
    こんなところで躓いていた…
  • Enum で振る舞う - Qiita

    Java の列挙型 Java の列挙型は、C 言語の enum と異なり、単なる int の定数列挙ではなく、オブジェクトの列挙になるので、メソッドを宣言したり、メンバ変数を宣言したりと、振る舞いを持たせることが出来る。 内部的には、列挙したオブジェクトは定数として扱われるので、列挙の数だけオブジェクトが予め生成されることになる。 詳細は Effective Java を読もう! 振る舞う enum 通常の enum の宣言は以下のようになる。

    Enum で振る舞う - Qiita
  • Java 8 in Action Lambdas, Streams and functional-style programming PDF Download Free | 1617291994

    SummaryJava 8 in Action is a clearly written guide to the new features of Java 8. The book covers lambdas, streams, and functional-style programming. With Java 8's functional features you can now write more concise code in less time, and also automatically benefit from multicore architectures. It's time to dig in!Purchase of the print book includes a free eBook in PDF, Kindle, and ePub formats fro

    Java 8 in Action Lambdas, Streams and functional-style programming PDF Download Free | 1617291994