2016-02-02 64 views
1

有大致相同的任務,不同的名字有方法很有意義,例如傳遞標誌(或沒有),Java中的構造

  • open(String filename);
  • createThenOpen(String filename); // First create the file with default contents, then process the file.

這種命名方法確實不適用於構造函數。想象一下,構造函數的文件名如上所示。我有各種選項來處理這兩種情況:

  1. If-statement in the constructor:if the file does not exist then create it。這並不好,因爲構造函數的行爲是隱含的,調用者可能會創建不需要的文件而不是打開現有文件。
  2. 給構造函數添加一個標記:MyClass(String filename, boolean createNew)。不是很好,因爲像MyClass("hello.txt", true)這樣的電話很神祕。
  3. 重載使單個參數始終假定文件存在,並且存在附加的虛擬參數意味着應該創建該文件。這也很醜。
  4. 添加一個字符串標誌,如RandomAccessFile(File file, String mode),其中mode"r","rw"等。這對我的目的感覺非常笨重。
  5. 添加enum - 與Files的標記類似copy(Path source, Path target, CopyOption... options)。感覺也很笨重。
  6. 有構造函數,它不接受任何參數,然後分離上面的方法,在創建對象後立即調用。不好,因爲沒有使用來自指定文件的數據來實例化對象的實例是沒有意義的。

目前我似乎確實喜歡上面的數字(6),並且簡單地有兩個不同名稱的方法在沒有參數的構造函數之後被立即調用。我是否忽略了任何選擇,或者對於這些場景是否存在「給定」方法?

編輯:爲別人指出的下方有一個7日,也許是最明顯的選擇當然是:

  • 使用工廠方法!
  • +1

    爲什麼不創建一個子類,如果該子類不存在,則該子類通過創建該文件來擴展行爲? – jonk

    +0

    對於選項2,make()聽起來不像一個非常好的構造函數。它的意思與班級名稱相同,所以你的班級名稱是什麼? – crowne

    +0

    使用子類是沒有意義的,因爲超類和子類將表示完全相同類型的對象。 – DustByte

    回答

    2

    讓你的構造函數的參數protected一個長長的清單,引進了大量的public static命名createFooWithBar()方法與調用你的構造精確的參數列表。

    +2

    也稱爲'工廠'方法,很好的第七選擇。 –

    +1

    唉!當然是。使用SO就像寫下發表的數學證明:你需要仔細地爲其他人提供證明,以便查看細節並發現其缺陷。 – DustByte

    +1

    @DustByte使用SO就像寫下證明,然後收到「你有一個錯誤,但我已經解決了你」 – alamar

    0

    使您的構造函數保持私有狀態並添加公共工廠方法。 我認爲這是一種非常普遍的模式。

    另一種模式是「建造者」。使構造函數只能訪問相同包的類。在同一個包中添加一個構建器(或者如果您願意,可以使用多個構建器),它將調用構造器並調用構造對象所需的任何其他方法。