public void foo() {
class Bar {
}
Bar b = new Bar();
}
我看不到任何情況下,方法本地類將是最好的設計選擇。你有沒有用過它?在什麼情況下?什麼是方法本地類用於?
public void foo() {
class Bar {
}
Bar b = new Bar();
}
我看不到任何情況下,方法本地類將是最好的設計選擇。你有沒有用過它?在什麼情況下?什麼是方法本地類用於?
一個用例是,當你有一個循環調用與接口類型作爲參數的方法,該方法使用只是這種方法。因此,而不是編寫一個分離的類,您可以定義一個方法本地類。 (匿名類方法可以工作,但如果是在循環,更好地創建一個類。)
interface A{ public int getValue();}
....
public void processValue(A a){}
....
public void showResults(){
class B implements A{
int getValue(){
return value;
}
}
for (int i=0;i<10;i++){
processValue(new B())
}
}
我曾經使用過一次或兩次,當我需要稍微不同的參數化版本的同一事件監聽器連接到不同的擺動組件時,但除此之外,我傾向於比名稱本地更喜歡匿名類。
這方面的一個簡單的例子是
public void attachListeners(final JLabel label) {
class ButtonListener implements ActionListener {
private String value;
public ButtonListener(String val) { value = val; }
public void actionPerformed(ActionEvent e) {
label.setText(value);
}
}
button1.addActionListener(new ButtonListener("value1"));
button2.addActionListener(new ButtonListener("value2"));
}
我用它在我需要的鍵值對的情況和我的鑰匙並沒有映射到現有的類。我不想讓我的「關鍵類」在我的方法之外。
舉例來說,密鑰可能由Employee
和Date
組成,並且這些值是該僱員在該日期的預訂小時數。在這種情況下,它可能是這樣的:
public void doExcitingCalculation() {
class EmployeeDateKey {
private Employee employee;
private Date date;
// Getters and setters ommited for brevity
}
Map<EmployeeDateKey, Double> bookedHours = new HashMap<>();
Map<Empoyee, Map<Date, Double>> temp = fetchData();
// This isn't a useful datastructure, so we remodel it
for (Map.Entry<Employee, Map<Date, Double>> entry : temp.entrySet()) {
for (Map.Entry<Date, Double> hours : entry.getValue().entrySet()) {
bookedHours.put(new EmployeeDateKey(entry.getKey(), hours.getKey()), hours.getValue());
}
}
// process data
}
但類EmployeeDateKey將不會在方法fetchData()中可見,不是嗎?它導致內聯fetchData()方法,這將導致巨大的方法doExcitingCalculation()。 –
這似乎沒有用處。或者方法設計有缺陷(它沒有真正的工作) – Ankit
好的@@ Oleksandr.Bezhan,我重寫了代碼以更好地解釋我的意思。 – mthmulders
使用方法局部類可以通過保持相關部件連接在一起提高代碼的可讀性。作爲一個人爲的例子,假設你有一個需要創建一個線程做一些後臺的方法:
class Test {
void f() {
// lots of stuff
new Thread(new Runnable() {
public void run() {
doSomethingBackgroundish();
}
}).start();
// lots more stuff
}
}
沒有方法,局部類,你就必須要麼:
創建一個新的命名類內部Test來做後臺處理,或者 在一個單獨的源文件中創建一個新的命名類來做後臺處理。 這兩個選項都可以通過在源代碼樹中的其他位置移動相關處理(可能位於相同的源文件中,可能完全位於另一個源文件中)來降低代碼的可讀性。使用方法本地類可以使處理邏輯正確使用。
這當然不適用於所有情況,但它在許多常見情況下可能非常有用。這種代碼通常用於GUI動作偵聽器,它們是非常小的類,通常只是將動作方法調用從一個地方傳遞到另一個地方。
你能提供代碼片段嗎?這真有趣! –
謝謝。有趣的解決方案。 –