我正在Java中製作一個簡單的記事本應用程序,並試圖使用流暢且不可變的樣式,以便試用它。我發現它非常有趣,並且在功能性編程(代碼清晰度等)方面看到了很多優點。不可變對象之間的事件處理
但我在事件處理一般問題。我有一個TextArea類,它提供了一個類似記事本的文檔,就像你期望的那樣。然後我有另一個類ScrollBar。它們由一個主類CentralController操縱,它使滾動條和文本區域一起工作(不是真正的類名,它僅用於此示例)。
所以,如果用戶按下的向下箭頭,CentralController簡單地調用TextArea.withDownArrow(),並用光標向下移動,返回文本區的新副本。問題是滾動條現在需要移動,所以CentralController需要知道TextArea是否被該向下箭頭滾動。
我首先要解決它的嘗試是返回不僅包含新文本區,也是一個標記,滾動是否需要更新的對象。這很好,但感覺不對,因爲我不再返回TextArea,而你真的應該進行「正確的」函數式編程(粗略地說)。
於是我試圖在內部具有將被置如果TextArea.withDownArrow文本區標誌()引起的滾動。這也很好,但在類中存儲「全局」方法結果似乎是錯誤的。它也有問題,你可能會調用withDownArrow()兩次,然後標誌被覆蓋一個新的結果。
我讀了一些關於無編程和它似乎很有趣,但我不知道它是適合這種情況下,你有一個「孩子」類將消息發送到同級。
只是添加,我的印象是正常的事件處理不會在這種情況下工作。使用不可變的對象來改變你創建一個新對象的時候。所以任何嘗試發送事件給偵聽器的對象都會發送到一箇舊的指針。
我錯過了一個明顯的方式來做到這一點,因爲我覺得我是?或者,實際上使用普通的Java事件處理技術是否可行,我什麼都不擔心?
編輯:我想我已經制定了一個足夠好的解決方案。儘管接收事件的類(ScrollBar)總是被重新創建,但該類的成員不會被重新創建。只有變化的東西。
所以我只是在ScrollBar中有一個簡單的事件接收器方法,TextArea可以有一個監聽器列表(基本上是用監聽器進行事件的'正常'方法)。
總之我的錯誤就在想,我需要一個事件發送到一個實例,而不是實例的成員。
只是要清楚,我每次修改都會返回一個全新的TextArea。目前這一切都運行良好(表現良好),但我對這些事件並不滿意。此外,這些對象是我的「純」模型的一部分,實際的屏幕繪圖方法在其他地方,只是看着模型並呈現它。 – LegendLength