on inner classes
DESCRIPTION
On Inner Classes. Atsushi Igarashi (Univ. of Tokyo) joint work with Benjamin Pierce (Univ. of Penn.). Inner Classes in Java. Class declaration in a class as a member just as fields/methods inside a method (a.k.a. local/anonymous classes) - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/1.jpg)
On Inner Classes
Atsushi Igarashi (Univ. of Tokyo)
joint work with Benjamin Pierce (Univ. of Penn.)
![Page 2: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/2.jpg)
Inner Classes in Java Class declaration in a class
as a member just as fields/methods inside a method (a.k.a. local/anonymous
classes) Direct access to members of its enclosing
definitions Programming style similar to nested functions
Extensively used in event-driven programming (e.g., AWT)
![Page 3: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/3.jpg)
Inner Classes in AWT programming Counter and event handler (ActionListener)
Method regButton associates a listener with a given button
Every time the button is pressed, x will be incremented through the invocation of actionPerformed of the listener object
class Counter { int x=0; void regButton(Button b) { b.addActionListener(new Listener());} class Listener implements ActionListener { public void actionPerformed(ActionEvent e) { x++; }}}
![Page 4: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/4.jpg)
Complication (1): Scoping Rules Directly accessible members are in
superclasses enclosing classes even superclasses of enclosing classesclass A { Object f; … }class B { Object f; class C extends A { void m() { … f … // which f?}}}
![Page 5: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/5.jpg)
Complication (2): Inheritance Almost any form of inheritance is allowed
Inner class is inherited outside of the defined scope
Inner class can extend its enclosing class
class A { … class B { … }}class C extends A.B { … }
class A { … class B extends A { … }}
![Page 6: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/6.jpg)
Official Specification by JavaSoft Explains what inner classes are and how to
compile them to Java Virtual Machine Language
However, it is not quite sufficient indirect
the semantics is given only via compilation informal and sometimes ambiguous
written in English prose interpreted differently by different versions of
JDK
![Page 7: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/7.jpg)
Our Goal Clarification of the essence of inner
classes by formalization of core features direct semantics compilation and its correctness scoping rules
Feedback to language design
![Page 8: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/8.jpg)
Contributions Design of a toy OO language, FJI, with inner
classes extension of Featherweight Java (FJ)
[Igarashi&Pierce&Wadler OOPSLA99] w/o local/anonymous classes and access control
annotations Formalization of the language
direct operational semantics and type system scoping rules
![Page 9: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/9.jpg)
Contributions (contd.) Formalization of the current compilation
scheme Proof of type soundness and correctness of
compilation
FJ program
FJI program(more Java-like syntax)
Elaboration(scoping rules) FJI program
compilation
e e’
|e| *|e’|
Type preserving reduction/translation
![Page 10: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/10.jpg)
Outline Basic Constructs about Inner Classes Overview of Formalization Interaction with Inheritance Concluding Remarks
![Page 11: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/11.jpg)
Enclosing Instances Every instance of an inner class is associated
with an enclosing instance of the enclosing class e.g., Listener object has its Counter object to
increment
cf., function closure = code + environment new Listener() in Counter creates a listener
whose enclosing instance is this
int x;counter
void actionPerformed(…){ x++; }
listener
![Page 12: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/12.jpg)
.this Notation Enclosing instance is accessible with C.this
C is the enclosing class’s name
Direct access to x is just an abbreviation of access to the field x of the enclosing instance
class Counter { int x; … class Listener … { public void actionPerformed(…){ Counter.this.x++; } … }}
int x;counter
void actionPerformed(…){ x++; }
listenerCounter.this
![Page 13: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/13.jpg)
Prefix to new Enclosing instance of a newly created object
can be explicitly specified by prefixing new e.new Listener() creates a new listener where Counter.this refers to e, which is a Counter object
new Listener() in the class Counter is an abbreviation of this.new Listener()
You can instantiate a Listener even outside the class CounterCounter c = new Counter();
Counter.Listner l = c.new Listener();
![Page 14: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/14.jpg)
Formalization: FJ+Inner Classes (FJI) FJ [Igarashi&Pierce&Wadler OOPSLA99]
Slogan: “-calculus” for Java a tiny sublanguage of Java with ...
• top-level class declarations, inheritance• subtyping• fields, (side-effect-free) methods• method recursion through this
simple reduction semantics•e e’ (w.r.t. a certain set of class definitions)
Testbed for formalizing extensions of Java such as parameterized classes
![Page 15: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/15.jpg)
Formalization: FJ+Inner Classes (FJI) FJ [IgarashiPierceWadler99]
+ Inner Classes as Members
notation C.this for enclosing instances prefix to new notations to support inheritance (explained
later)
![Page 16: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/16.jpg)
Example of FJI Program
Method body consisting of a single return The method set_g returns a new object rather
than updating the field g
class A { class B { Object f; Object g; B(Object f, Object g) { this.f=f; this.g=g; } B set_g(Object x) { return new B(f, x); }}}
External syntax
![Page 17: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/17.jpg)
Example of FJI Program
Method body consisting of a single return Everything is made explicit by elaboration
“fully-qualified” type names this/A.this before field accesses and new
class A { class B { Object f; Object g; B(Object f, Object g) { this.f=f; this.g=g; } A.B set_g(Object x) { return A.this.new B(this.f, x); }}}
Internal syntax
![Page 18: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/18.jpg)
Reduction Relation: e e’ When a method is invoked, the redex
becomes the method body (the expression after return), replacing formal parameters, this and A.this
The value for A.this is immediate from the form of the receiver
(new A().new B(a,b)).set_ g (c) [c/x, new A()/A.this, new A().new B(a,b)/this] A.this.new B(this.f, x) (= new A().new B(new A().new B(a,b).f, c)) new A().new B(a,c)
![Page 19: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/19.jpg)
Inheritance and Inner Classes Inherited methods may require a different
environment i.e., enclosing instance How do you create an object of C.D?
Class A { int i; class B { void inc_i(){ A.this.i++; }}}
class C { int j; class D extends A.B { void inc_j() { C.this.j++; }}}
int j;Object C
Object D(also B)
C.thisA.this
int i;Object A
inc_i(){ i++; }
inc_j(){ j++; }
![Page 20: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/20.jpg)
Prefix to super(); Constructor of D must specify the value for A.this used in B by prefixing super();
Both a.new B().inc_i() and c.new D(a).inc_i() increments i of a
In FJI, a prefix is restricted to be a constructor argument The prefix can be any expression in Java Even under such a restriction, computing A.this
gets rather complicated
class C { int j; class D extends A.B { D(A a){ a.super(); } … }}
![Page 21: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/21.jpg)
Technical Results Definition of FJI
reduction semantics and type system main complexity in the computation of
enclosing instances in method invocations Elaboration (scoping rules) in the full version
Formal rules of compilation to pure FJ Closure conversion of class definitions
Theorem: type soundness Theorem: correctness of compilation
![Page 22: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/22.jpg)
What was “Real” Complication? An instance of an inner class is just like a
closure! Convenient for exporting a small piece of code
outside Environment is represented by an object called
enclosing instanceLiberal subclassing lets methods from one
object refer to distinct environments By certain restrictions,
we wouldn’t need a prefix to super simpler semantics could be given
![Page 23: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/23.jpg)
Subtlety in Scoping RulesSome classes/packages can be
inaccessible! Necessity of syntax for “top-level”?
c.f. “::” in C++class A { … }class B { … class A { // you can’t use the top-level class A, // or package A here!! }}
![Page 24: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/24.jpg)
Related Work Block expressions in Smalltalk
“closure” object no inheritance
Nested patterns in Beta Is it possible to write such weird programs? Virtual classes
e.new C() selects the invoked constructor depending on the run-time class of e
![Page 25: On Inner Classes](https://reader035.vdocument.in/reader035/viewer/2022070419/56815a91550346895dc80754/html5/thumbnails/25.jpg)
Future Work Local/anonymous classes
can be free from weird inheritance!! may refer to method parameters as free variables
final is required for method parameters referred to in such classes
interaction with side-effects is expected Access control annotations (public, private,...)
Correctness of compilation harder to prove JDK compiler may translate a private member to a
package member• insecure?• Bhowmik and Pugh’s implementation scheme
[PLDI99 poster session]