Talk:FriendPackages

From APIDesign

(Difference between revisions)
Jump to: navigation, search
Current revision (12:38, 15 November 2008) (edit) (undo)
 
(2 intermediate revisions not shown.)
Line 1: Line 1:
-
Accessor could perhaps be called ItemAccessor (living in ItemAccessor.java)? This makes it more obvious that you have to write this boilerplate for each class needing the back door. TBa
+
Comments by Tim Band (''TBa'').
-
* JST: Actually once per package is enough.
+
* ''TBa'': Accessor could perhaps be called ItemAccessor (living in ItemAccessor.java)? This makes it more obvious that you have to write this boilerplate for each class needing the back door. TBa
 +
* [[User:JaroslavTulach|''JST'']]: Actually once per package is enough.
-
It would be nice to be able to put in extra comments without cluttering up the text. Hovers would be ideal, but I guess not supported by this Wiki (and not in the code section anyway). Is there any way of doing footnotes? The particular point is the line l = listener in Item.java. This is presumably so that in the presence of multiple threads, an "obslete" listener may be called, but you will never get a null pointer exception. That's too much to clutter the code with, but it spent quite a bit of my effort working it out. TBa
+
* ''TBa'': It would be nice to be able to put in extra comments without cluttering up the text. Hovers would be ideal, but I guess not supported by this Wiki (and not in the code section anyway). Is there any way of doing footnotes?
 +
* [[User:JaroslavTulach|''JST'']]: This is [[wikipedia::mediawiki]] and it has a lot of extensions. More than I know about.
-
Should all the "default"s really be called "default"? aren't we really talking about TheAccessor or something? TBa
 
-
* JST: [[NetBeans]] usually call singleton returning methods getDefault(). Having symetric setDefault(...) is appropriate, I guess.
+
* ''TBa'': The particular point is the line l = listener in Item.java. This is presumably so that in the presence of multiple threads, an "obsolete" listener may be called, but you will never get a null pointer exception. That's too much to clutter the code with, but it spent quite a bit of my effort working it out.
 +
* [[User:JaroslavTulach|''JST'']]: The current code is not really multithreaded. As far as the initialization goes, it shall not matter, as it is expected that the ''setDefault'' method is part of implementation not API and as such it will be called just once.
-
It is much clearer setting the DEFAULT directly than the book's indirect classloader method, but now shouldn't setDefault be synchronized? TBa
+
* ''TBa'': Should all the "default"s really be called "default"? aren't we really talking about TheAccessor or something?
 +
* [[User:JaroslavTulach|''JST'']]: I am not sure I get the comment, but [[NetBeans]] usually call singleton returning methods getDefault(). Having symmetrical setDefault(...) is appropriate, I guess.
-
* JST: The classloading trick is still there, I just moved it outside of the code snippets. Just click on the name of the source file above each code snippet.
+
* ''TBa'': It is much clearer setting the DEFAULT directly than the book's indirect classloader method, but now shouldn't setDefault be synchronized?
-
** It is only necessary if someone uses Accessor first without Item being loaded (e.g. which is only possible while calling constructor, I guess)
+
* [[User:JaroslavTulach|''JST'']]: The classloading trick is still there, I just moved it outside of the code snippets. It is only necessary if someone uses Accessor first without Item being loaded (e.g. which is only possible while calling constructor, I guess):
-
** Otherwise the setDefault is still being called from static { ... } initializer and as such it is synchronized on the Item class.
+
 
-
** I might try to put a guard in constructor of Accessor:
+
<source lang="java" snippet="design.less.friend.InitAPI"/>
-
<source lang="java">
+
 
-
protected Accessor() {
+
* 'JST': It might be possible to to put a guard in constructor of Accessor just like in this example:
-
if (!getClass().getName().equals("api.AccessorImpl")) {
+
<source lang="java" snippet="forjoe.InterfaceThatJustJoeCanImplement"/>
-
throw new IllegalStateException();
+
-
}
+
-
}
+
-
</source>
+
-
and then the need for synchronization would be completely gone.
+

Current revision

Comments by Tim Band (TBa).

  • TBa: Accessor could perhaps be called ItemAccessor (living in ItemAccessor.java)? This makes it more obvious that you have to write this boilerplate for each class needing the back door. TBa
  • JST: Actually once per package is enough.
  • TBa: It would be nice to be able to put in extra comments without cluttering up the text. Hovers would be ideal, but I guess not supported by this Wiki (and not in the code section anyway). Is there any way of doing footnotes?
  • JST: This is wikipedia::mediawiki and it has a lot of extensions. More than I know about.


  • TBa: The particular point is the line l = listener in Item.java. This is presumably so that in the presence of multiple threads, an "obsolete" listener may be called, but you will never get a null pointer exception. That's too much to clutter the code with, but it spent quite a bit of my effort working it out.
  • JST: The current code is not really multithreaded. As far as the initialization goes, it shall not matter, as it is expected that the setDefault method is part of implementation not API and as such it will be called just once.
  • TBa: Should all the "default"s really be called "default"? aren't we really talking about TheAccessor or something?
  • JST: I am not sure I get the comment, but NetBeans usually call singleton returning methods getDefault(). Having symmetrical setDefault(...) is appropriate, I guess.
  • TBa: It is much clearer setting the DEFAULT directly than the book's indirect classloader method, but now shouldn't setDefault be synchronized?
  • JST: The classloading trick is still there, I just moved it outside of the code snippets. It is only necessary if someone uses Accessor first without Item being loaded (e.g. which is only possible while calling constructor, I guess):
Code from Accessor.java:
See the whole file.

private static final Class<?> INIT_API_CLASS = loadClass(
    Item.class.getName()
);
private static Class<?> loadClass(String name) {
    try {
        return Class.forName(
            name, true, Accessor.class.getClassLoader()
        );
    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }
}
 
  • 'JST': It might be possible to to put a guard in constructor of Accessor just like in this example:
Code from InterfaceThatJustJoeCanImplement.java:
See the whole file.

public abstract class InterfaceThatJustJoeCanImplement {
    protected InterfaceThatJustJoeCanImplement() {
        if (!"impl.joe.JoesImpl".equals(getClass().getName())) {
            throw new IllegalStateException(
                "Sorry, you are not allowed to implement this class"
            );
        }
    }
 
    public abstract void everyoneCallThisJoeWillHandleTheRequest();
}
 
Personal tools
buy