| <html> |
| <head> |
| <meta http-equiv="content-type" content="text/html; charset=UTF-8"> |
| <title>Restrictions on subclasses of JavaScriptObject</title> |
| </head> |
| <body> |
| <p>Subclasses of JavaScriptObject represent a view of a JavaScript |
| object from Java. Such classes must conform to a number of restrictions |
| so that the compiler can implement them. This page lists those |
| restrictions.</p> |
| <p>In the following, "JSO class" means any subclass of <code>JavaScriptObject</code>. |
| Rationales are written <em>like this</em>.</p> |
| <ol> |
| <li>All instance methods on JSO classes must be one of: |
| explicitly final, a member of a final class, or private. <em>Methods |
| of JSO classes cannot be overridden, because calls to such methods |
| could require dynamic dispatch.</em></li> |
| <li>An interface type may be implemented by at most one JSO |
| subtype. <em>This ensures that polymorphic dispatch via a |
| "SingleJsoImpl" interface can be statically resolved to exactly one |
| implementing JSO subtype.</em> |
| <ol> |
| <li>A <code>JavaScriptObject</code> that implements a |
| "SingleJsoImpl" interface may be further extended. The subclasses |
| may implement additional "SingleJsoImpl" interfaces. <em>The |
| methods on a JSO must be effectively final, so each "SingleJsoImpl" |
| method still has a 1:1 mapping to a method defined within a JSO |
| subtype.</em></li> |
| <li>It is valid for any number of any non-<code>JavaScriptObject</code> |
| types to implement a "SingleJsoImpl" interface. <em>There is a |
| slight runtime dispatch penalty when a "SingleJsoImpl" interface is |
| implemented by both JSO and non-JSO types.</em></li> |
| </ol> |
| </li> |
| <li>No instance methods on JSO classes may override another |
| method. <em>This catches accidents where JSO itself did not |
| finalize some method from its superclass.</em></li> |
| <li>JSO classes cannot have instance fields. <em>The fields |
| would have no place to live in web mode. Programmers should instead |
| make an explicit wrapper class and put the fields there.</em></li> |
| <li>Nested JSO classes must be static. <em>The implicit <code>this</code> |
| fields of a non-static inner class has the same problems as an |
| explicit field.</em></li> |
| <li>"new" operations cannot be used with JSO classes. <em>This |
| avoids ever being able to try to instantiate JSO objects using the new |
| keyword. New JSO instances can only come from JSNI, as in previous |
| versions of GWT.</em></li> |
| <li>JSNI methods may not refer to instance methods defined within |
| a <code>JavaScriptObject</code>.</li> |
| <li>Every JSO class must have precisely one constructor, and it |
| must be protected, empty, and no-argument.</li> |
| </ol> |
| </body> |
| </html> |