2010-05-04 69 views
2

我已經爲我的常規簡單命令創建了一個pkg。它們是非靜態的,具有更好的可擴展性,但由於創建對象而使用它更耗時。我的其他班級使用它們。Java:簡單命令的實現

$ ls *.java 
CpF.java  IsBinary.java  RmLn.java  Tools.java 
F2S.java  IsRoot.java  SaveToDisk.java WordCount.java 
Filters.java ModRelativePaths.java SetWord.java  WordNumber.java 
Find.java  powerTools.java  Sort.java 

您會選擇哪種選項更容易使用它們?

  1. 開發一個像pT的'powerTools.java'這樣的小接口。
  2. 爲他們創建一個靜態方法的類。
  3. 爲每個類添加一個靜態方法
  4. 停止過度使用'創建太多文件'並集中一些?
  5. sthing else?

靜態VS對象討論

  • 你怎麼能得到外界方法的工作就像在自己的類,而與他們的類名引用它們?不是class_name.method(),只是method()。外部方法來自不同的pkgs。
  • 代碼不能與進口靜電我的同班同學和PKG

    $ cat Test.java 
    import static a.*; 
    
    public class Test 
    { 
        public static void main(String[] args) 
        { 
         a.printHello(); 
        } 
    } 
    $ cat a/Hello.java 
    import java.io.*; 
    
    public class Hello 
    { 
        public static printHello(){System.out.println("Hello");} 
    } 
    
    $ javac Test.java 
    Test.java:1: cannot find symbol 
    symbol: class a 
    import static a.*; 
          ^
    Test.java:7: cannot find symbol 
    symbol : variable a 
    location: class Test 
         a.printHello(); 
         ^
    2 errors 
    $ sed -i '[email protected]@[email protected]' Test.java 
    $ javac Test.java 
    Test.java:1: cannot find symbol 
    symbol: class a 
    import static a.*; 
          ^
    Test.java:7: cannot find symbol 
    symbol : method printHello() 
    location: class Test 
         printHello(); 
    
    +2

    這些「命令」究竟代表什麼?他們是否使用'Runtime#exec()'間接調用shell命令?聽起來好像每個班級只有一種公共方法來完成實際任務,這是真的嗎? – BalusC 2010-05-04 21:00:23

    +0

    @BalusC:是 - 每個類有一個方法,有時候是不相關的方法。我之前遇到的問題是每個類的文件太少,每個方法的文件太少 - 現在我處於另一個極端,每個方法的文件太多 - 也不舒服。 – hhh 2010-05-04 21:09:18

    回答

    3

    乍一看,我敢打賭,他們都沒有維持任何狀態,因此可以安全地宣佈static。我也有這樣的印象:每個班級實際上只有一種公共方法,它只能同時執行一項任務。這聽起來好像他們被綁定到一個特定的平臺。

    如果所有上述是真實的,那麼你有兩個選擇:

    1. 只是一羣他們都在一個public final class PowerTools類與private構造(所以它不能被實例化)和public static方法,各做各的期望的任務。您最終可以使用原始類名作爲方法名稱。

    2. 定義public interface PowerTools這樣就可以實現LinuxPowerToolsWindowsPowerToolsMacPowerTools,等等。因此,創造一個抽象PowerToolsFactory返回自動根據當前平臺上所需實施方案(可以使用系統屬性os.name嗅出當前平臺)。

    如果這是純粹的愛好目的,選項1就足夠了。但是如果你明白我的意思,選項2更「專業」。

    更新:根據您的更新,您可以使用import static聲明。另請參閱此Sun Tutorial

    E.g.

    import static java.lang.System.*; 
    
    public class Test { 
        public static void main(String... args) { 
         out.println("foo"); 
         exit(-1); 
        } 
    } 
    

    如果你有一個包含public static方法com.example.PowerTools類,則可以按如下方式導入:

    import static com.example.PowerTools.*; 
    
    public class Test { 
        public static void main(String... args) { 
         if (isBinary(file)) { 
          // ... 
         } 
         saveToDisk(file); 
        } 
    } 
    
    +0

    @BalusC:關於靜態。擴展類,創建變體,構建獨立塊,爲PowerTools創建第二個分支,最終將事情分解爲更小的部分 - 對靜態聽起來不太好。後來我發現了一些我討厭的靜態混亂,因爲它很難用一個bug修復它。目前,我認爲我會保持獨立,讓他們更獨立,更多時間用於創建對象 - 當他們準備好自動組合時,讓他們做好工作。不確定第二。 – hhh 2010-05-04 22:13:51

    +1

    擴展類只有在擴展類應具有自己的狀態/行爲時纔有意義。可以通過添加重載的方法和/或包裝其他方法的方法來完成小部分的變化和中斷。在Apache Commons庫中查找示例,例如'IOUtils'(基於'java.io'),'DBUtils'(基於'java.sql')以及幾個像CommonU Lang一樣的'StringUtils'(基於'java.lang')。 – BalusC 2010-05-04 22:54:44

    +0

    當您使用靜態公共方法導入包含pkg的pkg時,您可以以某種方式停止編寫第一個引用部分,而不是像「class_name.method()」「method()」那樣寫?「(new class_name ))。method()「。我在開始時初始化的最後一個東西,所以它變得像」s.method()「一樣短,看不到靜態如何使這種方式更容易。 – hhh 2010-05-04 23:47:33

    0

    工作我定義一個類,G,只有靜態的方法。所以我打電話 G.print G.sort G.find等

    0

    我建議你組了一些這些功能彙集成一個類。然後,通過靜態方法,甚至只是單純的暴露你的API:

    boolean isRoot = new DirectoryHelper().isRoot(someFile); 
    boolean isBinary = new DirectoryHelper().isBinary(someFile); 
    new DirectoryHelper().saveToDisk(someFile); 
    

    是的,你正在創造新的每次對象,但除非你做這些操作的數萬次那麼這個開銷將永遠不會被注意到。通過上述方法,您現在可以更輕鬆地進行測試,並且更容易進行依賴注入。

    0

    如果這些是從shell中使用的命令行工具,請將所有類放在單個JAR中,並編寫一個簡短腳本以便按名稱調用每個類。將腳本存儲在路徑上,例如~/bin

    #!/bin/sh 
    java -cp your.jar pkg.Find "${@}" 
    
    #!/bin/sh 
    java -cp your.jar pkg.Sort "${@}" 
    

    "${@}"轉發任何參數。