2011-09-29 49 views
4

嗨我在面試問題文件中得到了這個問題。單身是有狀態的嗎?

辛格爾頓和原型(非單),它是有狀態的,並且是無狀態的

我不知道,如果原型是無狀態的?這個問題有什麼問題嗎?

+0

參見:http://stackoverflow.com/questions/1989149/spring-wiring-singleton-versus-prototype – 2011-09-29 18:17:55

+3

好了,單當然不是無國籍的。 –

+4

有狀態與無狀態的概念完全不相關的單身人士與不是單身人士的概念(在春天的背景下的原型) – DwB

回答

6

這個問題本身措辭不佳。你可以在單例和原型(實例)中都擁有狀態,因爲它是合法的代碼,但在任何情況下你都不需要擁有狀態。自從提到Spring之後,我將試着回答這個問題,以便與Spring合作。

在Spring bean範圍方面,singleton將導致ApplicationContext創建單個實例並在需要bean的任何地方使用該實例。 prototype將導致ApplicationContext在每次請求bean時創建一個新實例。

它們都是有狀態的。

+9

如果你沒有保持在你的單身國家單身人士的目的是什麼? – corsiKa

+1

'static'不是面向對象的;) – delnan

+1

singletons無論如何都被認爲是反模式。 – mre

0

一個更好的問題可能是「Singleton線程安全嗎?」

如果它包含的狀態是隻讀和不可變的,那麼它是完全線程安全的。如果它是可變的,你必須更加小心。如果是的話,它可能有成爲你的應用程序瓶頸的危險。同步該共享,可寫狀態必須完成。

4

如果您將「無狀態」稱爲「沒有對話狀態」,即與特定客戶端的對話相關的狀態,則此問題看起來非常合法(儘管措辭不佳)。

在這些條款中,singleton -scoped bean通常是無狀態的,因爲它們被多個客戶端同時使用,並且它們的狀態不是客戶端特定的。

相反,prototype -scoped豆經常在談話與特定客戶端的環境中創建的(儘管requestsession範圍可能更適合有時),讓自己的狀態與這些談話(因爲如果你的bean不需要保持任何對話狀態,你可以使它成爲一個singleton)。從這個意義上說,prototype豆是有狀態的。

5

Prototype bean和Singleton bean都可以持有狀態。但是,根據the Spring documentation,「你應該爲有狀態的所有bean使用原型範圍,而單態範圍應該用於無狀態bean」。

-1

一個無狀態的singleton幾乎是一個靜態方法的集合;它與靜態util類沒有什麼不同,它有多少個實例並不重要:0,1,2或無窮大。

因此單身人士通常是有狀態的。

(這就是爲什麼說在enum中實現的單例自動處理序列化問題是無稽之談。這個單身人士是無國籍的,這個論點是沒有意義的。如果單是有狀態的,該參數被打破)

0

單不是數據對象,考慮單作爲數據封裝, 點的接入方法,

單可能被破壞,但呈現狀態分別獨立地存儲和單之後將提交重新 (機器人發送問候,摧毀單身是臭名昭著的陷阱)