2013-10-07 95 views
2

擺脫幻數如何擺脫java的幻數不宣決賽或總決賽靜態的巨量?請記住循環,數組是不允許的。這似乎不可能?幫助讚賞。謝謝。入門Java中

示例代碼:

drawOval(5, 5, width, height); 
drawOval(10, 10, width, height); 
drawOval(15, 15, width, height); 
drawOval(20, 20, width, height); 
drawOval(25, 25, width, height); 
+0

那是'52'一個錯字? –

+0

這取決於什麼意思的值必須每個如果他們可以通過動態地改變了應用程序 – MadProgrammer

+0

@lc,是有它的運行時間。固定。 – Larry21

回答

6

定義常量是真的是你唯一的選擇。你有什麼反對使用它們?在這方面他們絕對值得他們的空間。未來的開發人員寧願看到額外的常量,也不願意被這些數字意味着什麼所困惑。

+2

+1。請使用命名常量。它使其他人的工作無限輕鬆。 – asteri

+1

是的,假設形狀的位置是相互關聯的,我會使用*一個*有名的常數和'* 2','* 3'等等。 –

1

的替代決賽/靜態的,我已經看到的是使用自定義的對象作爲參數:

public void drawOval(OvalArg arg) { 
    // ... 
} 

OvalArg arg = new OvalArg(); 
arg.first = 10; 
arg.second = 10; 
arg.width = 100; 
arg.height = 500; 

drawOval(arg); 

然而,這種方法意味着你不能直接看到哪些參數必須送到方法(除非您查看參數對象),並且需要額外的驗證以確保您的自定義對象被正確填充。出於這個原因,我會建議使用常量。

+1

如果你曾經用過Swing的'GridBagConstraints',你就知道這種技術有多荒唐。哈哈 – asteri

+0

哈哈,我從來都不是'GridBagConstraints'的忠實粉絲,對我來說它看起來是一種「硬編碼」的用戶界面。我在學校看到它,但也更喜歡更動態的佈局。 –

2

直接的答案是,命名常量是爲了避免在代碼中有幻數的唯一途徑。


但翻蓋側是,它是值得商榷幻數是否有害的(或他們是有害的程度)。而在這種特殊情況下,這些實際上是否符合「神奇」號碼是至關重要的......至少,IMO。

讓我們說明這一點:

// Alternative #1 

private final int PLACE_1_X = 5; 
private final int PLACE_1_Y = 5; 
... 
drawOval(PLACE_1_X, PLACE_1_Y, width, height); 

// Alternative #2 
drawOval(5, 5, width, height); 

哪一個是實際上更具可讀性?定義命名常量(最有可能在源代碼中的不同位置!)使得更容易理解發生了什麼?難道你現在有你要看看在兩個地方沒有一個明白什麼特定drawOval調用要繪製的問題?


底線是,「沒有神奇的數字」教條只有真正當它意義數字的應用是不言自明從上下文...或者當數實際上是反覆使用不變。 (就像我們打算在相同的「圖片」中使用PLACE_1很多次一樣)。

您需要考慮上下文,而不是盲目應用教條。