CSC/ECE 517 Fall 2007/wiki1b 6 aa: Difference between revisions

From Expertiza_Wiki
Jump to navigation Jump to search
Line 62: Line 62:


== '''Test '''==
== '''Test '''==
'''Ruby Test code'''
<pre>
class People
def pollute(a)  # pollute an earth object
a.currentCondition="i am old and polluted"
end
def test
p=People.new
earth1=Earth.instance
earth2=Earth.instance
earth1.currentCondition="I am young and clean"
puts "Earth1 says: " + earth1.currentCondition
puts "Earth2 says: " + earth2.currentCondition
# pollute earth1
p.pollute(earth1)
puts "After people pollute earth1"
puts "Earth1 says: " + earth1.currentCondition
puts "Earth2 says: " + earth2.currentCondition
end
end
p=People.new
p.test
</pre>
'''
Java test code'''
<pre>
public class People {
public void pollute(Earth earth){
earth.getEarth().setCurrentCondition("I am dirty and polluated");
}
public static void main(String args[]){
People p=new People();
Earth earth1= Earth.getEarth();
Earth earth2= Earth.getEarth();
System.out.println("earth1 says: " +earth1.getCurrentCondition());
System.out.println("earth2 says: " +earth2.getCurrentCondition());
p.pollute(earth1);
System.out.println("After people polute earth1");
System.out.println("earth1 says: " +earth1.getCurrentCondition());
System.out.println("earth2 says: " +earth2.getCurrentCondition());
}
}
</pre>

Revision as of 23:05, 30 September 2007

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?).

http://www.beginner-java-tutorial.com/singleton.html http://www.ruby-doc.org/stdlib/libdoc/singleton/rdoc/index.html



Example

Let's take the example of the Earth. Because we only have one earth,it is appropriate to implement the Earth class in singleton.In side the class, currentCondition describes the state (current condition) of the earth.

Ruby Implementation

require 'Singleton'

class Earth
  include Singleton  # include singleton mixin
  attr_accessor :currentCondition
end

Java Implementation


public class Earth {
	  private Earth()
	  {
	   // override the contructor to make it private
	  }
	  private static Earth ref;

	  // make the method thread safe
	  public synchronized static Earth getEarth()
	  {
	    if (ref == null)
	        // lazy initialization
	        ref = new Earth();		
	    return ref;
	  }

	  public Object clone()
		throws CloneNotSupportedException
	  {
	    throw new CloneNotSupportedException(); 
	  }

	  private String currentCondition="I was beatiful and clean";
	  
	  public String getCurrentCondition(){
		  return currentCondition;
	  }
	  
	  public void setCurrentCondition(String str){
		  currentCondition=str;
	  }
	  
	}

Test

Ruby Test code

class People
def pollute(a)  # pollute an earth object
a.currentCondition="i am old and polluted"
end

def test
p=People.new
earth1=Earth.instance
earth2=Earth.instance

earth1.currentCondition="I am young and clean"
puts "Earth1 says: " + earth1.currentCondition
puts "Earth2 says: " + earth2.currentCondition

# pollute earth1
p.pollute(earth1)
puts "After people pollute earth1"

puts "Earth1 says: " + earth1.currentCondition
puts "Earth2 says: " + earth2.currentCondition
end
end

p=People.new
p.test

Java test code


public class People {
	public void pollute(Earth earth){
		earth.getEarth().setCurrentCondition("I am dirty and polluated");
	}
	public static void main(String args[]){
		People p=new People();
		Earth earth1= Earth.getEarth();
		Earth earth2= Earth.getEarth();
		
		System.out.println("earth1 says: " +earth1.getCurrentCondition());
		System.out.println("earth2 says: " +earth2.getCurrentCondition());
		
		p.pollute(earth1);
		System.out.println("After people polute earth1");
		
		System.out.println("earth1 says: " +earth1.getCurrentCondition());
		System.out.println("earth2 says: " +earth2.getCurrentCondition());
		
	}
}