LoginSignup

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

アドベントカレンダー2015

Last updated at Posted at 2015-12-19

お疲れ様です。
アドベントカレンダー2015/12/19を担当させて頂きます、「低学歴」、「低収入」、「低身長」3低の金子です。
昨日は忘年会お疲れ様でした。
ちと忙しくてぎりぎりの投稿になってしまいました、すみません。




ん~みんなちゃんと書いてるし何を書こうかなぁ...と考えてます。
後輩から大したこと書けなくても書くことに意味があるんです。
って励まされました。
ええ子や~。




もし読んでくれて、記載に誤りあったら恥ずかしいからこっそり教えてくださいw
(※SさんおよびSさんのパートナーさんどうかよろしく)




ってことでここからは自分なりにちゃんと書いていこうと思います。
よろしくお願いします。




私は2013/4/1に入社して以来、約2年半お世話になった現場が今月で終了となります。
思い返せば本当にいろいろなことを教えてもらったし、とてもいい方がばかりで楽しい現場でした。
その中でもはじめて隣の席になったMさんは異業種からの転職で右も左もわからないような私を快く指導してくださり本当に感謝してます。
たまに仕様のことなどで言い争いをすることもあったけど、本当に大好きな先輩です。




ん??なんか手紙みたい...w




本題に戻ります。
今回は年末&現場終了という節目ということで初心に返って入社時に勉強したことやMさんに教えてもらった便利なことなどをいくつか書いてみようと思います。




まず初めはJavaの研修をしている頃に知らなかった「&」についてです。
Javaで「&&」ってよく使いますけど「&」ってあんまり使わないですよね!?
ってか私は正直「&」ってなんやねん??って思ってましたw




「&」はビット演算子のANDってことで、例えば以下のようなスイッチなんかに使えます。

HexadecimlSwitchSample.java
public class HexadecimlSwitchSample {

 //Javaでは0xで16進数
 public static final int SWITCH_A = 0x01; // 2進数:0000001 10進数: 1
 public static final int SWITCH_B = 0x02; // 2進数:0000010 10進数: 2
 public static final int SWITCH_C = 0x04; // 2進数:0000100 10進数: 4
 public static final int SWITCH_D = 0x08; // 2進数:0001000 10進数: 8
 public static final int SWITCH_E = 0x10; // 2進数:0010000 10進数:16
 public static final int SWITCH_F = 0x20; // 2進数:0100000 10進数:32
 public static final int SWITCH_G = 0x40; // 2進数:1000000 10進数:64

 public static void main(String[] args) {

  int check = 127;//Integer.parseInt("1111111", 2);

  //「&」ビット演算子 論理積
  if ((check & SWITCH_A) == SWITCH_A) {
   //1
   System.out.println(Integer.toBinaryString(check & SWITCH_A));
  }
  if ((check & SWITCH_B) == SWITCH_B) {
   //10
   System.out.println(Integer.toBinaryString(check & SWITCH_B));
  }
  if ((check & SWITCH_C) == SWITCH_C) {
   //100
   System.out.println(Integer.toBinaryString(check & SWITCH_C));
  }
  if ((check & SWITCH_D) == SWITCH_D) {
   //1000
   System.out.println(Integer.toBinaryString(check & SWITCH_D));
  }
  if ((check & SWITCH_E) == SWITCH_E) {
   //10000
   System.out.println(Integer.toBinaryString(check & SWITCH_E));
  }
  if ((check & SWITCH_F) == SWITCH_F) {
   //100000
   System.out.println(Integer.toBinaryString(check & SWITCH_F));
  }
  if ((check & SWITCH_G) == SWITCH_G) {
   //1000000
   System.out.println(Integer.toBinaryString(check & SWITCH_G));
  }
 }
}





続いて「Lombok」というJavaのライブラリのご紹介です。
例えば以下のようにアノテーションを付与するだけで、getterメソッドやsetterメソッドをコード上に直接書かなくて済みます。

LombokSample.java
//クラスにつければ全フィールド
//@Getter
//@Setter
public class LombokSample {

 @Getter
 @Setter
 private int num;

 @Getter
 @Setter
 private String str;

}

Lombokとは?




続いてはObserverクラスを使ってFileInputStream のclose()イベントの監視を行う処理です。

ObserverSampleMain.java
public class ObserverSampleMain {

 public static void main(String[] args) {
  ObserverSample os = new ObserverSample();
  os.execute();
 }
}
ObserverSample.java
public class ObserverSample implements Observer{

 public void execute() {
  ObservableFileInputStream in = null;
  try {
   in = new ObservableFileInputStream("file.txt");
   in.addObserver(this);
   int ch;
   while ((ch = in.read()) != -1) {
    System.out.print(Integer.toHexString(ch) + " ");
   }
  } catch (IOException e) {
   System.out.println(e);
   } finally {
   if(in != null){
    try {
     System.out.println("before");
     in.close();
     System.out.println("after");
    } catch (IOException e) {
     System.out.println(e);
    }
   }
  }
 }

 //updateメソッドをオーバーライトして状態変化の通知があった際の処理を記述
 @Override
 public void update(Observable paramObservable, Object paramObject) {
  System.out.println("Closeされました!");
 }
}
ObservableFileInputStream.java
public class ObservableFileInputStream extends FileInputStream {

 private final InnerObservable observable;

 //コンストラクタ
 public ObservableFileInputStream(String paramString) throws FileNotFoundException {
  super(paramString);
  this.observable = new InnerObservable();
  observable.setChanged();
 }

 //closeメソッドをオーバーライトして状態変化を通知する
 @Override
 public void close() throws IOException {
  try {
   super.close();
  } finally {
   //状態変化を通知する
   observable.notifyObservers();
   }
 }

 static class InnerObservable extends Observable {
  @Override
  public synchronized void setChanged() {
   super.setChanged();
  }
 }

 public void addObserver(Observer o) {
  observable.addObserver(o);
 }
}

上記の処理ではFileInputStreamがcloseされた際にupdateに記述した処理が実行されます。
こんな使い方でいいのかなぁ?
勉強不足と時間が足りなくて細かい説明は記載が間に合わなかったので後日修正します。
すみません。
ちゃんとObserverパターン勉強します...たぶん...w




ってか投稿ぎりぎり間に合ってなくてすみません。。。

最後まで読んでくださった方ありがとうございます。

3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up