Skip to content

Instantly share code, notes, and snippets.

@numa08
Created July 27, 2013 07:37
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save numa08/6094138 to your computer and use it in GitHub Desktop.
Save numa08/6094138 to your computer and use it in GitHub Desktop.
渋谷Javaで発表してきた

final狂の詩

at 渋谷Java

@numa08

自己紹介

  • @numa08
  • 新宿で働いてる
  • 新卒ですよ
  • 同期に先輩って呼ばれる
  • 主にAndroidとiOS

突然ですが

finalしてますか?

final宣言

  • 変数への再代入を許さない
  • クラスの継承を許さない
  • オーバーライドを許さない

final宣言

  • 変数への再代入を許さない

みんな大好きfinal宣言 

final int hoge = 0;
hoge = 1; //ここでコンパイルエラー

ここで昔話

最初にアサインしたプロジェクトの話。

  • Androidのプロジェクト

  • Activity(画面)だけで50近く←わかる

  • View(ボタンとか画像とか)を全てフィールド変数として宣言している←え?

  • フィールド変数の宣言だけで100行以上←ふぁっ!?

  • Activityだけで1000行以上←▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂

  • なんだかよくわからない変数名

  • もちろん全部finalしてない

  • ついでにprivateもしてない

  • フィールドと、getterとsetterしかないクラス

  • フィールドも100個近く・・・

  • 今は使わないものもある

  • どれが使うやつかそうでないか判別不能

メンテ性低すぎ泣いた

変更しないのにfinalじゃない?

全部finalすればええんや!

 ( ◠‿◠ )

 楽しい!!

 ✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

final宣言に命削ってる気がします

final宣言のために

-elseを使わない

-setterを使わない

finalできないやつ

Fee fee = null;

if(customer.isChild()){
  fee = Fee.CHILD_FEE;
} else {
	fee = Fee.ADULT_FEE;
}

メソッドに分離して早期リターン

private Fee calcFee(Customer customer){
	if(customer.isChild){
		return Fee.CHILD_FEE;
	}
	return Fee.ADULT_FEE;
}
final Fee fee = calcFee(customer);
//finalできた!

mapを使う

final Map<Boolean, Fee> feeis = 
				new HashMap<Boolean, Fee>{{
	put(Customer.IS_CHILD,Fee.CHILD_FEE);
	put(Customer.IS_ADULT,Fee.ADULT_FEE);
}}
final Fee fee = feeis.get(customer);
//finalできた!!

interfaceを使う

private interface CalcFee{ public Fee calc(Customer c);}
final Fee fee = new CalcFee(){
		public Fee calc(Customer customer){
			if(customer.isChild){return CHILD_FEE;}
			return ADULT_FEE;
		}
	}.calc(customer);
//finalできた!!(しろめ)

finalできた!

(´,,•ω•,,`)わわっ!finalできてますね!!

(๑´╹‸╹`๑)早期リターンでメソッド増えましたね

(๑´╹‸╹`๑)Mapでジェネリクスを使うと、オートボクシングが・・・

(๑´╹‸╹`๑)interfaceってそうやって使うもの?

ヾ(๑╹◡╹)ノ"あ、でもfinal「は」できてますね!

final宣言のために

-elseを使わない -setterを使わない

setterを使わない

フィールドはfinal宣言

public class Profile{
	private final String name;
	private final int age;

	public Profile(String name, String age){
		this.name = name;
		this.age = age;
	}
}

フィールドが多いならビルドパターン

final Profile me = new ProfileBuilder()
			.setName("numa08")
			.setAge(24)
			.setCity(Chofu)
			.setSex(Male)
			.create();

値を変える場合は、オブジェクトを変える

public class Profile{
	public Profile changeCity(City city){
		return new ProfileBuilder()
			.setName(this.name)
			...
			.setCity(city).create();
	}}
final Profile newProfile = oldPfofile.changeCity(Shibuya);

finalできた!

(´,,•ω•,,`)わわっ!またfinalできてますね!!

(๑´╹‸╹`๑)コンストラクタが肥大化しましたね・・・

(๑´╹‸╹`๑)ビルドパターンとか知ってる人いるんですか?		

(๑´╹‸╹`๑)オブジェクトの変えちゃうって、大富豪ですね

ヾ(๑╹◡╹)ノ"あ、でもfinal「は」できてますね!

諸問題

  • むやみにfinalつけるとGCとかどうなの?
  • 変なinterfaceの使い方すると可読性下がるだけだよね
  • ビルドパターンとか、オブジェクトの変更とかいいけど、コード量増えたね
  • 本当にそれでメンテ性とか上がったの?

そこで

Scalaを使いましょう

Scalaなら

変数は基本、再代入不能

val hoge = 1
hoge = 2 //コンパイルエラー

変なinterfaceいらない!!

val fee = ((cusomer:Customer) => {
		if(customer.isChild){
			FEE_CHILD
		} else {
			FEE_ADULT
		}
	})(customer)//無名関数ってやつですね

そもそもifが値を返します

val fee = if(customer.isChilde){
		FEE_CHILD	
	} else {
		FEE_ADULT
	}

そんなわけで

主に麹町でScalaについて勉強をしたい人が集まって、ゆるふわな感じでScalaを勉強する集まり。

次回は8/3(土)

きてね!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment