最近、同僚と新しいプログラミング言語について話し合いました。 Kotlinについて話した後、私の友人は「変数をnullにできることを指定していない場合、nullを渡すことはできません」というフレーズを落としました。 このフレーズは本当に私を困惑させました-Javaの既知の言語能力と比較して、Kotlinのキラー機能は本当に重要ですか? この質問に対する反省は、これらの新しい言語機能がすべて必要な理由を(おそらく最初に自分自身に)示したいフレームワーク内で、複雑な例になりました。
既に実行されている言語の開発で最も退屈な部分は、日常的なタスクです。 たとえば、写真を表示します。 すべてのプロジェクトで多くの規則に囲まれている、絶対に普通のタスク。
そのような例をいくつか挙げましょう。
- ダウンロードした画像は「円で」表示する必要があります(円は非常にスタイリッシュです)
- ロード後、画像を表示サイズに圧縮します(メモリを浪費するものはありません)
- 画像を希望のサイズおよび/または比率に圧縮する必要があります
- ロードに失敗した場合、デフォルトのリソースを表示します
多くの既製のライブラリでサポートされている絶対に日常的な規則(たとえば、Androidの場合はPicasso、Glideなど)。
したがって、ダウンロードするたびに、一連の同様の設定を転送する必要があります。 これより少ないCPU時間とメモリを消費し、テンプレートなどを使用できるようにすることをお勧めします...
最も基本的な形式では、このようなデータのセットはおよそ次のクラスを表します。
public class ImageSets { Boolean inCircle = false; Boolean needFit = false; Size size = null; int defaultDrawableResource = -1; }
このままにしておくと、その作業は次のようになります。
例 void useCase() { BaseJavaClass some = new BaseJavaClass(); some.inCircle = true; some.needFit = true; some.defaultDrawableResource = 0; some.size = new Size(128, 128); System.out.println(some.inCircle); System.out.println(some.needFit); System.out.println(some.size); } static ImageSets pattern(){ BaseJavaClass some = new BaseJavaClass(); some.inCircle = true; some.needFit = true; some.defaultDrawableResource = 0; some.size = new Size(128, 128); return some; }
このアプローチにはいくつかの不利な点がありますが、いくつかの不利な点があります。
- 「一部」の永続的な言及。呼び出されたとき。 複数の呼び出しの場合(そして、ここでは単に関連性があります)、コードは大幅に膨張します。
- テンプレートを使用するには、毎回テンプレートの新しいインスタンスを作成する必要があります-そうしないと、誰かがその中に入って何かを修正することができます-楽しみが提供されます。
セッターの助けを借りて最初の病気に対処するのが慣習です(もちろん、変数のセット全体でコンストラクターを宣言できますが、Javaに3つ以上の変数があり、それらのいくつかがオプションである場合、Some(0、 0、null、null、null、-1、5)):
たくさんのコード public BaseJavaClass setInCircle(Boolean inCircle) { this.inCircle = inCircle; return this; } public BaseJavaClass setNeedFit(Boolean needFit) { this.needFit = needFit; return this; } public BaseJavaClass setSize(Size size) { this.size = size; return this; } public BaseJavaClass setDefaultDrawableResource(int defaultDrawableResource) { this.defaultDrawableResource = defaultDrawableResource; return this; } void useCase(){ BaseJavaClass some = new BaseJavaClass() .setInCircle(true) .setNeedFit(true) .setDefaultDrawableResource(0) .setSize(new Size(128, 128)); } static BaseJavaClass pattern1() { return new BaseJavaClass() .setInCircle(true) .setNeedFit(true) .setSize(new Size(128, 128)); }
そうですね。 しかし、2番目の問題をどうすればよいでしょうか? 通常、補助_Bulderクラスはそれを解決するために使用され、その呼び出しにはセッターが含まれ、メインクラスのゲッター呼び出しは以下のみを行います。
たくさんのコード public class ImageSets { protected Boolean inCircle = false; protected Boolean needFit = false; protected Size size = null; protected int defaultDrawableResource = -1; public Boolean getInCircle() { return inCircle; } public Boolean getNeedFit() { return needFit; } public Size getSize() { return size; } public int getDefaultDrawableResource() { return defaultDrawableResource; } public static final ImageSets pattern = new ImageSetsBuilder() .setInCircle(true) .setNeedFit(true) .setDefaultDrawableResource(0) .setSize( new Size(128, 128)); } public class ImageSetsBuilder extends ImageSets { public ImageSetsBuilder setInCircle(Boolean inCircle) { this.inCircle = inCircle; return this; } public ImageSetsBuilder setNeedFit(Boolean needFit) { this.needFit = needFit; return this; } public ImageSetsBuilder setSize(Size size) { this.size = size; return this; } public ImageSetsBuilder setDefaultDrawableResource(int defaultDrawableResource) { this.defaultDrawableResource = defaultDrawableResource; return this; } }
他にも多くの方法がありますが、最も一般的なソリューションを提供しました。
データはどうなりましたか? 4つの変数のみを含むクラスが同様のサイズに成長したのはどうしてですか? 変数を追加するとどうなりますか?
同じクラスですが、Kotlin言語では次のようになります。
class ImageSets( val inCircle: Boolean = false, val needFit: Boolean = false, val size: Pair<Int, Int>? = null, val defaultDrawableResource: Int = -1)
それだけです! 次を使用できます。
val pattern = ImageSets( inCircle = true, needFit = true, defaultDrawableResource = 0, size = 128 to 128) fun useCase(){ val some = ImageSets( inCircle = true, needFit = true, defaultDrawableResource = 0) print(some.needFit) }
Kotlinで書かれた例には、次の利点があります。