2015-06-10 23 views
0

我需要一些關於如何構建我的Java應用程序的建議。我個人喜歡決定 - 比如在Python或C++中 - 如果我編程OO或不。對我而言,靜態是一種在Java中執行相同操作的方法。編程「靜態」的另一種方法是:代碼正常嗎?

我讀過,大多數人說靜態是「邪惡」。所以我想到了另外一個選擇,就是用靜態方法來做同樣的事情。

什麼有關創建一個名爲「StaticClasses」包含每個類,它的方法/屬性通常將是靜態的一個實例的類。

我可以創建的StaticClasses一個實例,並設置在創建每個對象此實例的引用。

我甚至可以創建新的對象類mObject,這是新的父級的一切 - 對象後直接設置這些引用。

而且我可以使StaticClasses類辛格爾頓。

只是小代碼示例,讓你知道我的意思:

// mObject.java 
public class mObject{ 
    static StaticClasses staticCl = StaticClasses.I; 
} 

// StaticClasses.java 
public class StaticClasses{ 
    public static StaticClasses I = new StaticClasses(); 

    // declare instance of each "static" class 
    public Example0 ex0 = new Example0();  
    public Example1 ex1 = new Example1(); 

    private StaticClasses(){ 
    } 
} 

// Example0.java 
public class Example0 extends mObject{ 
    public void do_something(){ 
     System.out.println("function call example 0"); 
    } 
} 

// Example1.java 
public class Example1 extends mObject{ 
    public void do_something2(){ 
     // class "static" function 
     staticCl.ex0.do_something();  
    } 

    public static void main(String[] args){ 
     // call "static" function 
     staticCl.ex1.do_something2(); 
    } 
} 

這是一個好的或不好的想法?你知道有什麼改進嗎?你知道這個代碼的缺點嗎?靜態應該有更好的性能,但不應該有太大的區別。或者我應該在需要的地方手動設置引用 - 即使這意味着更復雜的代碼。

UPDATE:

你不喜歡單身。不帶單身人士的新代碼(名稱不是最終的):

// mObject.java 
public class mObject{ 
    Classes cl; 
    public mObject(Classes c){ 
     cl=c; 
    } 
} 

// Classes.java 
public class Classes{ 
    // declare instance of each "static" class 
    public Example0 ex0 = new Example0(this);  
    public Example1 ex1 = new Example1(this); 
} 

// Example0.java 
public class Example0 extends mObject{ 
    public void do_something(){ 
     System.out.println("function call example 0"); 
    } 
} 

// Example1.java 
public class Example1 extends mObject{ 
    public void do_something2(){ 
     // class "static" function 
     cl.ex0.do_something();  
    } 

    public static void main(String[] args){ 
     // call "static" function 
     cl.ex1.do_something2(); 
    } 
} 
+0

如果它們不是靜態的,我不會稱之爲'StaticClasses'。 – shmosel

+4

這是[常量'接口'反模式](https://en.wikipedia.org/wiki/Constant_interface)的擴展使用[上帝對象](https://en.wikipedia.org/wiki/God_object )來保存你的單身人士。通過創造一些真正可怕的東西,你正在避免一個Java的「詔書」(「靜態」是邪惡的)。我會**強烈**建議你避免像瘟疫這樣的模式。如果某些東西需要是單身人士,請使用['enum' singleton pattern](http://stackoverflow.com/a/23721155/2071828)。我會進一步建議你閱讀關於DI - 這是建議,而不是全球狀態。 –

+0

爲什麼在mObject中重新定義「StaticClasses」的實例「I」,而您可以通過StaticClasses.I訪問它? –

回答

1

這對零利益來說是很多併發症。你可以創建一個單例實例並拋出一些繼承,但最終你不能粉飾掉你仍然在調用靜態方法的事實。

Java允許使用靜態方法來讓您編寫不是100%面向對象的代碼。例如,Math.sin(0.5)是完美的;你不需要寫new Double(0.5).sin()之類的東西。避免靜態方法的建議不是你需要遵循的教條 - 這是一個普遍的警告,你可能想要考慮更加面向對象的方法。你的方案根本無助於使事物更加面向對象,所以這是一個誤導性的努力。

+0

感謝您的回答;我更新了我的代碼,所以沒有更多的單身人士。認爲好處可能是,如果意外發生,我需要創建第二個實例。 – AnnoSiedler

+0

不過,這可能是一個非常不恰當的使用繼承。 (我不能肯定地說出你的假設名字。) –

+0

對不起,但是還有一個最後的問題:創建一個僅用於容納其他對象的類是可以的,不是嗎? – AnnoSiedler

1

這是很難回答一個學術的例子。 靜態是邪惡的是一般規則,並且作爲任何一般規則它可能有例外。一種是singleton模式,其中singleton對象是通過靜態方法訪問的類中的靜態變量。以Spring Framework這樣的大型知名項目爲例,你會發現它們使用靜態的。

靜態被認爲是邪惡的,因爲當其他對象或類更適合時經常使用它。一個常見的例子是大學的學生。大學的名字對於所有的學生來說都很常見,第一個想法是在學生階段使其成爲靜態的,就像大學的其他參數一樣。現在,隨着課程的親切感,你想把它擴展到另一所大學...所有的崩潰,因爲大學在學生課堂上是靜態的:你應該有一個大學課程和學生課程中的一個對象(非靜態)

另一個例子是一個類中的對象數量。通常情況下,使用工廠對象來計算它們比靜態字段要好:如果稍後要分別計算兩種對象,該怎麼辦?

對於你目前的問題,最好的答案是在鮑里斯蜘蛛的評論:你正在通過創建一個真正可怕的避免一個Java「詔書」(靜態是邪惡的)。

相關問題