2013-08-18 131 views
0

對於基準測試,我需要三種不同的設置(「全部保留」,「保留大小」和「不保留」),所以我儘管可以使用枚舉。然後我看到我需要多次運行一些案例(基準使用種子隨機),而我最初的枚舉變得非常不靈活。對於Caliper,我需要重複枚舉項。經過一番嘗試失敗使其正常,我結束了本哈克的想法:這個hacky枚舉可以改進嗎?

private enum Randomization { 
    USE_EXAMPLE_1, 
    USE_EXAMPLE_2, 
    KEEP_EXAMPLE_SIZE_1, 
    RANDOM_1, 
    RANDOM_2, 
    RANDOM_3, 
    ; 

    final boolean keepAll; 
    final boolean keepSize; 

    private Randomization() { 
     keepAll = name().startsWith("U"); 
     keepSize = !name().startsWith("R"); 
    } 
} 

它不正是我想要的,我可以添加或刪除以最小的開銷實驗。有沒有更好的解決方案?

回答

1

有沒有什麼更好的解決辦法嗎?

嗯,這是不是真的很清楚爲什麼你需要擺在首位這些重複的枚舉值 - 我懷疑我有一個枚舉類型,只是包括邏輯值,然後用重複的值填充的集合代替。

另一種選擇是有像在當前一個,更多的邏輯枚舉,其中所述構造函數的「重複」枚舉需要參考「邏輯」一個代替的一個實例的枚舉。

如果你真的想保持目前的結構,我個人溝keepSizekeepAll部分的推理,並改爲使用參數的構造函數:

private enum Randomization { 
    USE_EXAMPLE_1(true, true), 
    USE_EXAMPLE_2(true, true), 
    KEEP_EXAMPLE_SIZE_1(false, true), 
    RANDOM_1(false, false), 
    RANDOM_2(false, false), 
    RANDOM_3(false, false), 
    ; 

    final boolean keepAll; 
    final boolean keepSize; 

    private Randomization(boolean keepAll, boolean keepSize) { 
     this.keepAll = keepAll; 
     this.keepSize = keepSize; 
    } 
} 
+0

*填充集合* - 通常是的,但我怎麼能讓Caliper和它一起工作呢?我可以編寫'@Param隨機化隨機化'並嘗試所有值。這也適用於'boolean's,但是對於其他任何你需要枚舉(作爲註釋的字符串參數)要使用的值。 – maaartinus

+0

@maaartinus:我還沒有使用Caliper,但是如果這真的是最好的方法,我會很驚訝。 –

+0

如果我需要讓我們說五次或五次以上的重複,這將是一個壞主意。但我只想爲隨機實驗嘗試多個種子,並且爲確定性實驗嘗試一次。 – maaartinus

1

你可以在你的枚舉領域,做一些像下面這樣。枚舉的實例方法可以訪問域像往常一樣類:

private enum Randomization { 
    USE_EXAMPLE_1(1), 
    USE_EXAMPLE_2(2), 
    // ... 

    private final int flag; 

    Randomization(int flag) { 
     this.flag = flag; 
    } 
} 

這避免了重命名enum的潛在價值重構的問題,不配合你的名字。