[prev in list] [next in list] [prev in thread] [next in thread]
List: openjdk-openjfx-dev
Subject: Re: Code Review Request For 8155757: Encapsulate impl_ methods in animation, canvas, image, input, l
From: Jim Graham <james.graham () oracle ! com>
Date: 2016-04-29 23:04:00
Message-ID: fb4b2694-1f4e-8dbf-1894-d8d74c288d24 () oracle ! com
[Download RAW message or body]
One comment on the implementation. For the methods used by an accessor inner class, \
if you make them private in the outer class then that inner class will need a hidden \
accessor method to be added in the bytecodes. If you make them package-private then \
they can access the method directly.
Basically, an inner class is really "just another class in the package, but with a \
special name" and actually have no access to private methods in their outer classes \
at all, but javac works around this by adding a hidden method that has more open \
access and using that.
An example is Image.getPlatformImage() - you turned it from "public and impl_" into \
private. Why not just leave it package-private/default access?
For example, compiling this class:
public class InnerPrivateTest {
private void foo() {}
public class InnerClass {
public void bar() { foo(); }
}
}
yields this byte code for InnerPrivateTest.class:
public class InnerPrivateTest {
public InnerPrivateTest();
Code:
0: aload_0
1: invokespecial #2 // Method java/lang/Object."<init>":()V
4: return
private void foo();
Code:
0: return
static void access$000(InnerPrivateTest);
Code:
0: aload_0
1: invokespecial #1 // Method foo:()V
4: return
}
and this for the InnerClass:
public class InnerPrivateTest$InnerClass {
final InnerPrivateTest this$0;
public InnerPrivateTest$InnerClass(InnerPrivateTest);
Code:
0: aload_0
1: aload_1
2: putfield #1 // Field this$0:LInnerPrivateTest;
5: aload_0
6: invokespecial #2 // Method java/lang/Object."<init>":()V
9: return
public void bar();
Code:
0: aload_0
1: getfield #1 // Field this$0:LInnerPrivateTest;
4: invokestatic #3 // Method \
InnerPrivateTest.access$000:(LInnerPrivateTest;)V 7: return
}
Changing the access on foo() to default (package private), yields this byte code:
public class InnerPackageTest {
public InnerPackageTest();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
void foo();
Code:
0: return
}
public class InnerPackageTest$InnerClass {
final InnerPackageTest this$0;
public InnerPackageTest$InnerClass(InnerPackageTest);
Code:
0: aload_0
1: aload_1
2: putfield #1 // Field this$0:LInnerPackageTest;
5: aload_0
6: invokespecial #2 // Method java/lang/Object."<init>":()V
9: return
public void bar();
Code:
0: aload_0
1: getfield #1 // Field this$0:LInnerPackageTest;
4: invokevirtual #3 // Method InnerPackageTest.foo:()V
7: return
}
...jim
On 4/29/16 11:50 AM, Chien Yang wrote:
> Hi Kevin,
>
> Please review the proposed fix:
>
> JIRA: https://bugs.openjdk.java.net/browse/JDK-8155757
> Webrev: http://cr.openjdk.java.net/~ckyang/JDK-8155757/webrev.00/
>
> Thanks,
> - Chien
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic