カテゴリー別アーカイブ: Java

Java 8 Optional

Java 8では, nullをより安全に処理するための仕様であるOptional型が導入されました. 使い方はこんな感じです.

OptionalのクラスメソッドであるofやofNullable (値がnullかもしれない場合に利用) でOptionalインスタンスを生成できます.

Optionalでラップされた値を取り出す (アンラップする) には, Optionalインスタンスの以下のメソッドを利用します.

Method Description
get 単純なアンラップ
orElse nullでなければ, アンラップ. nullであれば, 第1引数に渡したオブジェクトを返す.
orElseGet nullでなければ, アンラップ. nullであれば, 第1引数に渡した関数の結果を (遅延処理して) 返す.
ifPresent nullでなければ, 第1引数に渡した関数を実行. nullであれば何もしない.
map nullでなければ, 第1引数に渡した関数の実行結果を返す. nullであれば空のOptionalを返す.

Java CASによるアトミック演算

CAS (Compare And Swap) を利用することで, 比較処理と代入処理をアトミックに実行する (= 他のスレッドに割り込まれない) ことが可能になります. さらに, マルチスレッドにおける排他制御の手法 (synchronizedやLock) よりも, ロックをしないので高速な処理が可能です.

JavaでCASを実行するには, Atomic***のクラスを利用します.

AtomicIntegerで整数のインクリメントをアトミックにする例です.

Java byte配列・char配列 < - > Stringインスタンス 変換

備忘録的に…

Stringインスタンス (文字列) を, byte配列に変換する

byte[] bytes = "TESTtestString".getBytes();

Stringインスタンス (文字列) を, char配列に変換する

char[] chars = "TESTtestString".toCharArray();

char配列をStringインスタンス (文字列) に変換する

String str = String.valueOf(chars);
//String str = new String(chars);  //コンストラクタ呼び出しでも可能ですが, valueOfのほうがパフォーマンス良いそうです

Java チャットアプリ

JavaのSocketを利用したコンソール上で動作するチャットアプリを実装してみました.

1. まずは, サーバー側を起動して.
2. 別のコンソール上でクライアント側をポート番号を指定して起動します.

3. ‘quit’を入力すれば終了します.

現状の実装では, 1クライアントしか接続できませんが, 今後はマルチスレッドを利用して1対多の接続が可能になるように実装する予定です.

Java ソケットプログラム

Javaでソケット通信する簡単なプログラムを実装してみました.

・サーバー側
・クライアント側

まずは, サーバー側のプログラムをコンソールで起動してください.
現状では, 1回の通信で終わってしまうので, 簡単なチャットレベルのことをできるように, 近い将来改良しておきます.

ちなみに, 以前, C言語でシステムコールを利用したソケットプログラムをごりごり書いていた時期がありました…

デコレータパターン

デコレータパターンとは, 既存のオブジェクトに変更をすることなく, 新しい機能を追加することです.

代表的な実装例としては, Javaのストリームですね.

InputStream input    = new FileInputStream("input.txt");
OutputStream input = new FileOutputStream("output.txt");

これを, InputStreamReader / OutputStreamWriterでデコレートすることで, バイトストリームを文字ストリームに変換するという機能が追加できます.

Reader input  = new InputStreamReader(new FileInputStream("input.txt"));
Writer output = new OutputStreamWriter(new FileOutputStream("output.txt"));

さらに, さらに, BufferedReader / BufferedWriterでデコレートすることで, バッファリングという機能が追加できます.

Reader input  = new BufferedReader(new InputStreamReader(new FileInputStream("input.txt")));
Writer output = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("output.txt")));

JavaScriptの場合, プロトタイプ継承 (インスタンスの継承) という動的な継承関係をもてることから, デコレータパターンとは非常に相性が良いです.

さらに, 言えばjQueryではデコレータを実現するためのメソッドがあります.

//再帰的にデコレートするために, 第1引数にはtrueを指定する.
//デコレートした新規オブジェクトを返すために, 第2引数には空のオブジェクトを指定する.
var settings = $.extend(true, {}, defaults, options);

jQueryプラグインの実装では, イディオムのようなコードですね.

Java バイトストリームから文字ストリームへの変換

Androidアプリの作成では, ファイル (ストリーム) 処理をあつかう機会がなかったので, ちょっとしたサンプルコードを作成してみました.

変換のためには, InputStreamReader / OutputStreamWriterを利用します. これらは, 文字ストリームの抽象基底クラスであるReader / Writerを継承しています.

Javaのストリームを学ぶことはデコレータパターンの好例を学ぶことでもあります.

Android タイトルバーのカスタマイズ

まずは, タイトルバーをカスタマイズしたいアクティビティで,

//....

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);

//これらのメソッドの実行順序を変更するとカスタマイズエラーになる
 requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
 setContentView(R.layout.activity_main);
 getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.activity_main_title);

 //....
}

//....

次に, styles.xmlにカスタムのスタイルを追加する.

<resources xmlns:android="http://schemas.android.com/apk/res/android">
     <!-- .... -->
     <style name="CustomTheme"parent="android:Theme">
        <!-- タイトルバーの高さ -->
        <item name="android:windowTitleSize">24dp</item>
        <!-- デフォルトのタイトルバーを無効にする --> <item name="android:windowTitleBackgroundStyle">@null</item>
     </style>
</resources>

 そして, マニフェスト (AndroidManifest.xml) にstyles.xmlで定義したスタイルを設定する.

    <application
        ....
        android:theme="@style/CustomTheme"> ....

最後に, タイトルバーのレイアウトをXMLで定義すればOK. ファイル名はアクティビティで指定したもの (今回の例だと, activity_main_title.xml)

<?xml version="1.0"encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="24dp"
     android:background="#CC0000">

     <TextView
          android:id="@+id/text_title"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_centerInParent="true"
          android:paddingLeft="8dp"
          android:textColor="#FFFFFF"
          android:textSize="16sp"
          android:textStyle="bold"
          android:text="@string/app_name"/>

</RelativeLayout>

ちなみに, こちらのサイトが非常に参考になりました.