HomeDigital EditionSys-Con RadioSearch Java Cd
Advanced Java AWT Book Reviews/Excerpts Client Server Corba Editorials Embedded Java Enterprise Java IDE's Industry Watch Integration Interviews Java Applet Java & Databases Java & Web Services Java Fundamentals Java Native Interface Java Servlets Java Beans J2ME Libraries .NET Object Orientation Observations/IMHO Product Reviews Scalability & Performance Security Server Side Source Code Straight Talking Swing Threads Using Java with others Wireless XML
 

"Eiffel-Like separate Classes
Extending Java's concurrency model with asynchronous objects"
Vol. 5, Issue 11, p. 56

	


Listing 1: Sample class code for later processing

separate public class A {
	void m1(){
  		//... m1's code
	}

	public void m2(Integer x) {
		// ... m2's code
	}

   // ... Other class' code 
}

Listing 2: A straightforward implementation of separate behavior attached statically to a class

import java.lang.reflect.*;

public class A implements Runnable {
 // Data needed for each method invocation
 private Method _method;	   // Method to invoke
 private Object[] _params; // Method's parameters
 private Object _ret;	   // Return value

 public void run(){
  try {
	 _ret = __method.invoke(this,_params);
	} catch(Exception e){
	 System.out.println("Error: " + e.getMessage());
	};
 }

 // Methods to execute the separate way 
 synchronized public void m1(){
  Class [] FormalParams = new Class[0];
	_params = new Object[0];
	try {
    _method = this.getClass().getMethod("orig_m1", 
                                     FormalParams);
   } catch(NoSuchMethodException e){
		System.out.println("Error: " + e.getMessage());
	};
   new Thread(this).start();
	return;
	}

 synchronized public void m2(Integer x) {
  Class [] FormalParams = { x.getClass() };
   _params = new Object[1];
   _params[0] = x;
   try {
     _method = this.getClass().getMethod("orig_m2", 
                                     FormalParams);
   } catch(NoSuchMethodException e){
     System.out.println("Error: " + e.getMessage());
	};
  	new Thread(this).start();
	return;
 }

 // The original programmer's methods
 public void orig_m1(){ 
 		// ... m1's code
 }

 public void orig_m2(Integer x){
  		// ... m2's code
 }
 
  // ... Other class' code 
}

Listing 3: A Java class applying separate to a class's field

class A {
	public void m1(){
  		//... m1's code
	}
}

class B {
   public static void main(String[] args) {
  	   separate A _a = new A();
		_a.m1();
	}
}

Listing 4: Separate behavior implementation for a class's field

import java.lang.reflect.*;
class A {
	// Elements for SEPARATE behavior attached to 
  //  fields.
	synchronized public void separate_m1()  {
	 try {
		new _Aux.callMethod(this.getClass().getDeclaredMethod("m1", new Class[0]), 
                         new Object[0]) ; ???FMA - This line is too long !!!
   } catch(Exception e) { 
     System.out.println("Error: " + e.getMessage()); 
   }
	}

   public class _Aux implements Runnable {
		private Method _method;
		private Object[] _params;
		private Object _ret;

		public void callMethod(Method _method, 
                            Object[] _params)  {
			this._method = _method;
			this._params = _params;
			new Thread(this).start();
		}

		public void run() {
			try {
    			_ret = _method.invoke(A.this,_params);
	 		} catch(Exception e){}
		}
	} // End of the inner class
	
	// Original class code
   	public void m1() {
// ... m1's code
	}
}

class B {
  public static void main(String[] a) {
	A _a = new A();
	_a.separate_m1();
  }
}

Listing 5: Separate added to the set of the language's reserved words and literals

TOKEN :
{
... // All Java tokens plus ...
| < SEPARATE: "separate" >
}

Listing 6: Changes made to the Java language grammar
... 
void TypeDeclaration() :
{}
{
  LOOKAHEAD( ( "abstract" | "final" | "public" |
               "separate" )* "class" ) 
  ClassDeclaration()
|
  InterfaceDeclaration()
|
  ";"
}

void ClassDeclaration() :
{}
{
  ( "abstract" | "final" | "public" | "separate" )*
  "class" <IDENTIFIER> [ "extends" Name() ] 
  [ "implements" NameList() ]
  "{" ( ClassBodyDeclaration() )* "}"
}

void ClassFieldDeclaration() :
{}
{
  ( "public" | "protected" | "private"  | "static" | 
    "final"  | "transient" | "volatile" | "separate" )*
  Type() VariableDeclarator() ( "," 
         VariableDeclarator() )* ";"

  
 
 

All Rights Reserved
Copyright ©  2004 SYS-CON Media, Inc.
  E-mail: [email protected]

Java and Java-based marks are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and other countries. SYS-CON Publications, Inc. is independent of Sun Microsystems, Inc.