2009-05-17 40 views
5

想知道下面是否被認爲是良好的編程習慣?我喜歡儘可能簡潔和簡潔地記錄個人源文件,但我想知道更多有經驗的編程人員會怎樣看待它。我特別喜歡Settings.java類的想法,將我所有的「魔術數字」都保存在一個地方。有沒有人有任何建議可以改善我的情況?Java - 這是不錯的編程習慣嗎?

快樂編碼:-)

class ApplicationLauncher 
{ 
    public static void main(String[] args) 
    { 
     SwingApplication mySwingApplication = new SwingApplication(); 
    } 
} 

////////////// 

import javax.swing.*; 

public class SwingApplication extends JFrame 
{ 
    public SwingApplication() 
    {  
     JFrame myJFrame = new JFrame(); 
     myJFrame.setSize(Settings.frameWidth, Settings.frameHeight); 
     myJFrame.setVisible(true);  
    } 
} 

////////////// 

class Settings 
{ 
    static int frameWidth = 100; 
    static int frameHeight = 200; 
} 
+4

您可以通過四個空格縮進它格式化代碼。這可以通過選擇代碼並按下ctrl-k來自動完成。乾杯。 – Stephan202 2009-05-17 20:52:00

+0

謝謝。我仍然習慣這個網站的工作方式。我會牢記你對未來所說的話。 – 2009-05-17 20:57:59

回答

6

有一個設置類沒有錯;但是,在您的示例中,設置對於應用的框架而言頗爲模糊,既不是實際設置,也不是嚴格屬於SwingApplication類的默認值。

另一件我們無法控制的事情是Swing中的構造函數如何在程序的消息泵循環中級聯。

對我來說,從來沒有任何意義的構造函數永遠不會返回(除非框架關閉),並且不僅僅是初始化一個對象。

5

有特殊班,幻數爲靜態成員是一個優秀的Java實踐。

隨着程序的增長,可以使用多個設置類,每個設置類都帶有描述性名稱。

3

麥克覆蓋得很好。此外,通過這種方式,您可以在將來將某些設置輕鬆移到實際的用戶偏好設置中,以便他們可以自定義程序的不同部分。由於您的所有設置已被隔離到自己的課程中,因此您需要付出最少的努力。

4

有些人喜歡將所有這些東西,幻數等等放在一個大而醜陋的XML文件中,這些XML文件將在運行時讀取(並且有意義)。對於一個小型項目(例如一般課程作業),您的方法顯然是可行的,但考慮從XML文件獲取這些設置的明顯優勢:您不需要重新編譯源代碼以反映對設置所做的更改:)

+3

或屬性文件 – digitaljoel 2009-05-17 21:35:37

2

我認爲這可以是一個很好的做法,只要設置不太可能改變,並且記錄了設置之間的關係。如果這些可能會改變,那麼配置文件和/或命令行參數更有意義,因爲它們不需要重新編譯。

4

您正在使用一些人稱之爲「dreaded constants interface antipattern」的內容,儘管通常這些常量位於導入的接口中。我沒有問題,尤其是自靜態進口產品出現以來,但也許有人會讓我們充滿可怕的罪惡。其中之一似乎是「這不是什麼接口」。

更值得關注的是,你應該開始您的GUI線程:

//Schedule a job for the event-dispatching thread: creating 
    //and showing this application's GUI. 
    SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame myJFrame = new JFrame(); 
       myJFrame.setSize(Settings.frameWidth, Settings.frameHeight); 
       myJFrame.setVisible(true); 
      } 
     }); 
+2

反模式定義了一個接口,然後導入它,而不是像這樣使用它作爲靜態類。靜態導入特別使得導入和接口都是不必要的,就像「這不是接口的用途」一樣。 – 2009-06-04 17:59:46

1

可變的靜是一個非常糟糕的主意。堅持「從上面參數化」。

它被直接詢問,但示例代碼有其他問題。你已經延長了JFrame(一個不好的做法),但後來忽略了這一點,並創建了另一個JFrame來實際使用。此外,您還需要包含樣板以始終訪問AWT事件派發線程(EDT)上的Swing組件。

2

如果你打算爲你的幻數使用靜態數據,確保它們也是最終的,如果你的意思是他們不改變。

+0

小心!如果它們是最終的,編譯器會將這些值複製到引用它們的代碼中(作爲優化)。這意味着如果你改變常量的值,你需要重新編譯所有使用這些常量的代碼! (如果常量在單獨的罐子裏,這特別糟糕) – 2009-05-18 14:39:51

0

另一種不需要靜態導入的解決方案是創建一個帶有字段,getter和setter的完整「ApplicationSettings」類,並將此類的實例傳遞給需要參數的類的構造函數。例如,如果要在用戶調整窗口大小時保存新的大小,則可以保留一個易於保留或修改的配置對象。

4

正如其他人所說,這是非常好的做法,但也有一些事情可以做,以提高代碼:

  • 給這個Settings類的私人無參數的構造函數。這使得它不可能實例化並將其意圖作爲常量庫更加清晰。
  • 設置應該是final(不可變)以及static
  • 通常,Java中的常量寫入LIKE_THIS而不是likeThis
  • 如果您使用Java 1.5或更高版本,則可以在類中使用import static Settings.FRAME_WIDTH;,以便能夠直接使用FRAME_WIDTH而不必編寫Settings.FRAME_WIDTH

這結束你了:

class Settings 
{ 
    /** Do not instantiate! */ 
    private Settings() {} 

    static final int FRAME_WIDTH = 100; 

    static final int FRAME_HEIGHT = 200; 
} 
相關問題