VoQn 2014-01-14 18:30:19

[Java] 曰く、「getterアクセサを呼ぶ時にnullの時コンストラクタ呼ぶようにすれば余計なメモリを節約できる」 このエントリーをはてなブックマークに追加

投稿者からのアピールポイント

これは或るメンバに対するGetterとSetterの実装コードです

書いた人曰く、「一年間かけてリファクタリングしていたが、冗長性を上げたが故にメモリが足りなくなってきており、これからはパフォーマンス・チューニングをかける必要がある」と主張しておられました.

// なんか20000行くらいあるクラス

// ...

// 6000行目あたりに宣言されてたGetter

public FooBarDrawerBazOption getFooBarDrawerBazOption() {
    if (this.fooBarDrawerBazOption != null) {
        this.fooBarDrawerBazOption
            = new FooBarDrawer(
                                                this.hogehugaOptionHColor, // String
                                                this.hogehugaOptionVColor, // String
                                                this.hogehugaOptionHLength, // float
                                                this.hogehugaOptionVLength, // float
                                                this.hogehugaOptionHOffset, // float
                                                this.hogehugaOptionVOffset, // float
                                                new FooBarLineType[]
                                                {
                                                    FooBarLineType.PLAIN, // 悪名高い "interface 定数" っていうヤツ
                                                    FooBarLineType.PLAIN
                                                },
                                                new FooBarLineWidth[]
                                                {
                                                    FooBarLineWidth.NORMAL, // 悪名高い "interface 定数" っていうヤツ
                                                    FooBarLineWidth.NORMAL
                                                },
                                                this.isFooBarHDraw,
                                                this.isFooBarVDraw);
    }
    return this.fooBarDrawerBazOption;
}

// ...

// 17000行目あたりに宣言されてたSetter

public void setFooBarOptionHOffset(float newHogehugaOptionHOffset) {
     this.hogehugaOptionHOffset = newHogehugaOptionHOffset;
     this.hogehugaBazOptionHOffset = newHogehugaOptionHOffset;
     this.fooBarDrawerBazOption = null; // Drawerの内部メンバが変更されたので初期化
}

使い方ヒント: 「これは臭う」という行を見付けたら、各行のsmellをクリックしてマーキングしておきましょう(要Twitter OAuth認証)

コメント(5)

#1 c_9_l 2014-02-11 01:18:48  

パフォーマンス以前に動くんかこれ。。。
出来立てインスタンスor null しか返ってこない気が。。。

#2 kogaken1 2014-02-11 07:36:35  

FooBarDrawerをどうしてもimmutableにしたいのかなぁ…そもそもfooBarDrawerBazOptionとhogehugaOptionHColorなどの個別メンバとで2重管理するのも意味不明だ。

#3 guicho271828 2014-02-16 01:16:49  

あーあ、javaなんか使ってるから。Common Lisp, javaが必要ならclojureでマクロ書けばいいのに。 こういうテクをマクロに落とし込めば、そしたらあとは全アクセサを自動生成すればいいだけ。 抽象度の低い言語のつまらない仕様にがんじがらめにされるのはいやだね。

#4 tkcomcom1is 2014-02-23 13:17:23  

百歩譲ってメモリ不足解消は理解するとしても、コード量から察するに処理速度は物凄く低下しそうな気が……。

#5 tethon 2014-06-07 15:25:13  

If文の条件があれなので、いつもnullだけしか返らなそう…。

コメント投稿には、twitter認証が必要です。

Twitter認証

このウンコードに臭った人は、こちらのウンコードにも臭ってます

[Java] is禁止令

このエントリーをはてなブックマークに追加

ウンコードの趣旨とは違い、レビューで指摘...

// Mod yamada Start

// 一般的に考えて真偽値を返すメ...

鑑賞する »

[Java] もうコメント書くなお前

このエントリーをはてなブックマークに追加

改修案件でぶち当たったソース マジでこ...

/**
  *
  *   〇〇の値を取得する
  *
  */
pu...

鑑賞する »

[Java] 専用機

このエントリーをはてなブックマークに追加

山田さん(仮名)専用機らしいことがクラス...

/**
 * My Army Knife
 * 20XX/XX/XX
 *...

鑑賞する »