有大致相同的任務,不同的名字有方法很有意義,例如傳遞標誌(或沒有),Java中的構造
open(String filename);
createThenOpen(String filename); // First create the file with default contents, then process the file.
這種命名方法確實不適用於構造函數。想象一下,構造函數的文件名如上所示。我有各種選項來處理這兩種情況:
- If-statement in the constructor:if the file does not exist then create it。這並不好,因爲構造函數的行爲是隱含的,調用者可能會創建不需要的文件而不是打開現有文件。
- 給構造函數添加一個標記:
MyClass(String filename, boolean createNew)
。不是很好,因爲像MyClass("hello.txt", true)
這樣的電話很神祕。 - 重載使單個參數始終假定文件存在,並且存在附加的虛擬參數意味着應該創建該文件。這也很醜。
- 添加一個字符串標誌,如
RandomAccessFile(File file, String mode)
,其中mode
爲"r"
,"rw"
等。這對我的目的感覺非常笨重。 - 添加
enum
- 與Files
的標記類似copy(Path source, Path target, CopyOption... options)
。感覺也很笨重。 - 有構造函數,它不接受任何參數,然後分離上面的方法,在創建對象後立即調用。不好,因爲沒有使用來自指定文件的數據來實例化對象的實例是沒有意義的。
目前我似乎確實喜歡上面的數字(6),並且簡單地有兩個不同名稱的方法在沒有參數的構造函數之後被立即調用。我是否忽略了任何選擇,或者對於這些場景是否存在「給定」方法?
編輯:爲別人指出的下方有一個7日,也許是最明顯的選擇當然是:
- 使用工廠方法!
爲什麼不創建一個子類,如果該子類不存在,則該子類通過創建該文件來擴展行爲? – jonk
對於選項2,make()聽起來不像一個非常好的構造函數。它的意思與班級名稱相同,所以你的班級名稱是什麼? – crowne
使用子類是沒有意義的,因爲超類和子類將表示完全相同類型的對象。 – DustByte