2015-06-08 82 views
0

在策略模式,這樣實現的:斯卡拉:結合時間

object StrategyPattern { 

    def add(a: Int, b: Int) = a + b 
    def subtract(a: Int, b: Int) = a - b 
    def multiply(a: Int, b: Int) = a * b 

    def execute(callback:(Int, Int) => Int, x: Int, y: Int) = callback(x, y) 

def main(args: Array[String]) { 
    println("Add:  " + execute(add, 3, 4)) 
    println("Subtract: " + execute(subtract, 3, 4)) 
    println("Multiply: " + execute(multiply, 3, 4)) 
    } 
} 

我想知道(和發現怎麼也瞭解其他情況下,如果沒有爲類型/形式的一個很好的參考結合時間)如果方法add, substract, and multiply的結合時間是"construction time"(如果我可以這樣說),或者runtime

+0

這是不是很清楚你在問什麼。 –

+0

@Aaron Novstrup,我只是想知道這三種方法'加,減,乘'的綁定時間是多少? – Valerin

+0

@AaronNovstrup,例如:'object Something {Threat:Boolean = true}'的綁定時間是編譯時間。 – Valerin

回答

1

簡單的答案是(對於具體類)方法定義在編譯時綁定到方法名,就像它們在Java中一樣。你add方法,例如,是完全等同於這個Java定義:

public int add(int a, int b) { 
    return a + b; 
} 

非final方法

如果你從的角度分析非final方法的結合時間一個調用網站,其中的具體類不知道靜態,然後方法名稱將被視爲運行時綁定到其實現(由於子類/覆蓋)。

動態類加載

簡單的答案是接近真理,但在JVM動態類加載問題複雜化了一點。由於動態類加載,在運行時,方法定義在技術上與全限定名稱(例如,my.pkg.StrategyPattern.add)綁定。當然可以有一個my.package.StrategyPattern模塊的替代實現,並且可以動態地選擇它們(通過加載相應的類文件)。

當然,這種區別只與包含StrategyPattern定義的編譯單元之外的代碼有關。在編譯單元內,編譯時總是會考慮方法。

戰略

既然你問了策略模式,我想你心裏有什麼東西?如果你問你是否可以在「策略」中選擇在運行時,您可以:

val op: (Int, Int) => Int = 
    if (args(0) == "+") add 
    else if (args(0) == "-") subtract 
    else multiply 
execute(op, 3, 4) 

在這種情況下,op勢必會在運行時將「戰略」的功能,但addsubtractmultiply在編譯時仍然受到它們的定義的約束。

這是一個實現細節,每個這些方法在編譯時也與匿名類相關聯,並且根據條件表達式的結果在運行時實例化適當的類。這個細節實際上與綁定時間分析無關,因爲add,subtractmultiply標識符的含義在編譯時是固定的。

+0

你已經向我解釋了我正在尋找的東西。哇。感謝您寶貴的時間。我正在搜索,如果我能找到任何閱讀材料,可能與例子,我怎麼也可以自己undelook自己也大多數情況下... – Valerin

+1

我不知道具體的資源,直接解決綁定時間...我想你可以嘗試Java虛擬機,Java語言和Scala語言的規範。我的回答是基於我對JVM以及Scala如何編譯爲JVM字節碼的瞭解。是否有一個特定的編程問題激發了您的搜索? –

+0

這不是一個特定的問題。實際上,我遇到了這樣一種情況:我的工作在某些方面與價值,屬性,方法等有約束力的時間有如此強烈的關聯,並且我卡在這裏:(......,「直覺上」我可以區分大部分當編譯時或運行時綁定了某些特定情況的時候,但這就是它...我嘗試通過互聯網搜索一些有用的補充,並從中學習,但很難找到一篇專門的文章(不可能)!非常感謝,我非常感謝您的評論! – Valerin