CSC/ECE 517 Fall 2007/wiki1b 6 c1
Take a case of the Singleton pattern and implement it as succinctly as possible in Ruby and Java. Compare the two implementations in terms of clarity and succinctness. The example should be a "real-world" example. While it may be grossly oversimplified for the purpose of illustration, it should not be totally contrived (i.e., should not raise the question, Why would anyone ever want to do that?).
Illustration
The singleton pattern is a pattern used to insure the existence of a single instance of the class in the run time. As it construct the object once and return a reference to this object every time after. In multithreading environment special care should be taken, as it will be illustrated later in this page.
Implementation - The constructor of this class is turned to private. - Another public function is used to call this constructor. - If the object is not initialized yet (object == null) it call the constructor and return a reference else it will just return a reference.
In multithreading environment a synchronized command should be used so not every thread in the program can initialize his own instance of the singleton class.
Java
public class LoggerSingleton {
private static LoggerSingleton instance = null; protected LoggerSingleton() { // Exists only to defeat instantiation. } public static LoggerSingleton getInstance() { if(instance == null) { instance = new LoggerSingleton(); } return instance; }
}
Ruby
require 'singleton'
class LoggerSingleton
include Singleton
end
a = LoggerSingleton.instance »
- <MyClass:0x401b4ca8>
b = LoggerSingleton.instance »
- <MyClass:0x401b4ca8>
class Test
private_class_method :new @@singleton = nil def Test.instance @@singleton = new if @@singleton == nil return @@singleton end def initialize @thread = Thread.new { sleep 10 } end
end
test = Test.instance
Test singletons
Following a code to test singleton class in Java:
import org.apache.log4j.Logger; import junit.framework.Assert; import junit.framework.TestCase; public class SingletonTest extends TestCase {
private LoggerSingleton sone = null, stwo = null; private static Logger logger = Logger.getRootLogger(); public SingletonTest(String name) { super(name); } public void setUp() { logger.info("getting singleton..."); sone = LoggerSingleton.getInstance(); logger.info("...got singleton: " + sone); logger.info("getting singleton..."); stwo = LoggerSingleton.getInstance(); logger.info("...got singleton: " + stwo); } public void testUnique() { logger.info("checking singletons for equality"); Assert.assertEquals(true, sone == stwo); }
}
in ruby;
def test_singleton
class << OnlyOne.instance def reset # reset state end end
OnlyOne.instance.modify_state OnlyOne.instance.reset
end
Conclusion
Java doesn’t contain singleton pattern in the language itself, although implementation for the pattern is still possible. While in Ruby the singleton pattern is in the language itself, which became possible since Ruby is a dynamic language through singleton module.