この広告は、90日以上更新していないブログに表示しています。
クラス変数("@@")使う人あんまりいないと思うけど、グローバル変数と同じようなもんだから使うなよっていう話。
一見いい感じ。
classSingletonprivate_class_method(:new,:dup,:clone)defself.instance@@single ||= newendend
全てのサブクラス間で共有されてしまう。
classConfiguration <Singleton;endclassDatabase <Singleton;end>>Configuration.instance#<Configuration:0x00007fed1a890c88># NG: Configurationになっちゃう>>Database.instance#<Configuration:0x00007fed1a890c88>
「クラスメソッド内でインスタンス変数?」となるかもしれないが、クラスもオブジェクト。
classSingletonprivate_class_method(:new,:dup,:clone)defself.instance# @@ -> @に変更するだけ@single ||= newendend
スレッドを考慮すると上記実装では不十分。標準ライブラリのSingletonを使うと良い。
require"singleton"classConfigurationincludeSingletonend
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。