风格问题 - 成员变量与获取(路径)

Nic*_*tar 2 wicket coding-style

每当我必须将一些组件(A)添加到另一个组件(B)的AjaxRequestTarget时(通常是同一父级的两个子组件,我面临同样的决定:

使用父get(路径)方法,使A成为父组件的成员变量.两种变体似乎都有利有弊,我无法从"更好"代码的角度来决定哪种变得更好......

第一个变体是稳定的,即使(A)的路径发生变化,但是父母仍然很少使用很少使用的成员.另一个变体导致更清晰的父类,但在组件层次结构更改时添加了多个故障点.另外这个变体要么用魔术字符串(路径)或字符串常量(当我把路径放在那里时)来填充类...

任何提示都会被贬低.

编辑:这适用于Wicket 1.4,因为Wicket 1.5通过其EventBus解决了这个问题

Mar*_*rst 8

使用Wicket 1.5的事件机制代替使用Ajax更新组件.这样您就可以将发布者和订阅者分离.例如,请参阅我在JavaZone'11上给出的关于Wicket 1.5中功能的演示文稿(跳到谈话的大约51分钟).

取自Wicket 1.5发行说明:

组件间事件

Wicket 1.5提供了一种简单而灵活的方式,使组件能够以分离的方式相互通信.促成这一点的两个主要接口是:

/**
 * Objects that can send events
 */
public interface IEventSource {
    <T> void send(IEventSink sink, Broadcast broadcast, T payload);
}
Run Code Online (Sandbox Code Playgroud)

/**
 * Objects that can receive events
 */
public interface IEventSink
{
    /**
     * Called when an event is sent to this sink
     */
    void onEvent(IEvent<?> event);
}
Run Code Online (Sandbox Code Playgroud)

实现这些接口,从而可以参加活动机理的类别是:Component,RequestCycle,Session,和Application.

该机制允许在此定义不同的事件广播方法:

/**
 * Defines the event broadcast type.
 */
public enum Broadcast {
    BREADTH,
    DEPTH,
    BUBBLE,
    EXACT;
}
Run Code Online (Sandbox Code Playgroud)

wicket示例中有一个示例,演示了这种情况的用法.

应用程序可以在FrameworkSettings中注册自定义事件调度程序; 调度程序可用于构建自定义事件传递机制.例如,自定义IEventDispatcher机制可以将事件路由到带注释的方法,例如:

public class MyComponent extends Component {
    @OnEvent
    private void onUserAdded(UserAddedEvent event) {...}
}
Run Code Online (Sandbox Code Playgroud)

where UserAddedEvent事件有效负载对象.

Component#onEvent即使注册了自定义调度程序,也将调用默认方法.

每当Wicket开始创建AJAX响应时,都会引发默认事件.事件的有效负载是用于事件的AjaxRequestTarget.示例实施:

// component that always adds itself to the ajax response
public class MyComponent extends Component {
    public void onEvent(IEvent event) {
        if (event.getPayload() instanceof AjaxRequestTarget) {
            ((AjaxRequestTarget)event.getPayload()).add(this);
         }
    }
}
Run Code Online (Sandbox Code Playgroud)