<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Source: http://openide.netbeans.org/tutorial/api-design.html#design.less.friend
    Allow access only from a friend code
    Another useful technique to not expose too much in API is to give access to certain functionality (e. g. ability to instantiate a class or to call a certain method) just to a friend code.

    Java by default restricts the friends of a class to those classes that are in the same package. If there is a functionality that you want share just among classes in the same package, use package-private modifier in definition of a constructor, a field or a method and then it will remain accessible only to friends.

    Sometimes however it is more useful to extend the set of friends to a wider range of classes - for example one wants to define a pure API package and put the implementation into separate one. In such cases following trick can be found useful. Imagine there is a class item:

    public final class api.Item {
        /** Friend only constructor */
        Item(int value) {
            this.value = value;
        }
    
        /** API method(s) */
        public int getValue() {
            return value;
        }
            
        /** Friend only method */
        final void addListener(Listener l) {
            // some impl
        }
    }
    
    that is part of the API, but cannot be instanitated nor listened on outside of the friend classes (but these classes are not only in api package). Then one can define an Accessor in the non-API package:
    public abstract class impl.Accessor {
        public static Accessor DEFAULT;
    
        static {
            // invokes static initializer of Item.class
            // that will assign value to the DEFAULT field above
            Class c = api.Item.class;
            try {
                Class.forName(c.getName(), true, c.getClassLoader());
            } catch (ClassNotFoundException ex) {
                assert false : ex;
            }
            assert DEFAULT != null : "The DEFAULT field must be initialized";
        }
    
        /** Accessor to constructor */
        public abstract Item newItem(int value);
        /** Accessor to listener */
        public abstract void addListener(Item item, Listener l);
    }
    
    with abstract methods to access all friend functionality of the Item class and with a static field to get the accessor's instance. The main trick is to implement the Accessor by a (non-public) class in the api package:
    final class api.AccessorImpl extends impl.Accessor {
        public Item newItem(int value) {
            return new Item(value);
        }
        public void addListener(Item item, Listener l) {
            return item.addListener(l);
        }
    }
    
    and register it as the default instance first time somebody touches api.Item by adding a static initializer to the Item class:
    public final class Item {
        static {
            impl.Accessor.DEFAULT = new api.AccessorImpl();
        }
    
        // the rest of the Item class as shown above
    }
    
    Then the friend code can use the accessor to invoke the hidden functionality from any package:
    api.Item item = impl.Accessor.DEFAULT.newItem(10);
    impl.Accessor.DEFAULT.addListener(item, this);


    版權(quán)所有 羅明
    posted on 2006-01-05 21:01 羅明 閱讀(460) 評論(0)  編輯  收藏 所屬分類: Java
     
    主站蜘蛛池模板: 亚洲成人午夜电影| 亚洲午夜久久久久久久久久| 亚洲精品国产成人| 91精品免费国产高清在线| 麻豆亚洲AV永久无码精品久久| 国产无遮挡裸体免费视频在线观看| 亚洲无人区午夜福利码高清完整版| 中文日本免费高清| 国产亚洲成AV人片在线观黄桃| 日韩精品无码专区免费播放| 亚洲视频中文字幕| 国内精品乱码卡1卡2卡3免费| 亚洲AV无码一区二区三区在线| 亚洲AV天天做在线观看| 久久精品无码精品免费专区| 久久青草亚洲AV无码麻豆| 日本黄网站动漫视频免费| 亚洲fuli在线观看| 国产成人综合久久精品免费 | 亚洲中文字幕无码爆乳av中文| 又黄又大的激情视频在线观看免费视频社区在线| 好爽好紧好大的免费视频国产| 人成免费在线视频| 国产成A人亚洲精V品无码| 中文字幕亚洲免费无线观看日本 | 免费无码AV一区二区| 国产亚洲精品不卡在线| 亚洲免费在线播放| 激情亚洲一区国产精品| 国产一区二区视频免费| 在线观看黄片免费入口不卡| 亚洲视频免费观看| 日韩中文无码有码免费视频| 久青草视频97国内免费影视| 亚洲网站视频在线观看| 四虎永久免费地址在线观看| 大地资源在线资源免费观看| ass亚洲**毛茸茸pics| 亚洲一区精品伊人久久伊人| 国产h肉在线视频免费观看| 老妇激情毛片免费|