我有一个统一消息对象的队列,有多个生产者和一个消费者。消费者正在发布信息,并且需要能够根据数据的来源授予访问权限,因此我希望生产者发送合适的标识符以及消息。生产者自己不能对远端访问限制负责。
id应该与生成器在我的应用程序中的角色有关。我想强制所有生产者必须定义一个,并且子类生成者可以选择继承或重新定义它。生产者的类名称是一个很好的近似值,但我想要识别的属性并不是类结构中固有的,而是我定义的东西。
我可以使用反射来查找类名或接口名称,但这有点过多的开销。另外,我不确定要寻找的适当属性是什么。
由于所有生成器都是同一个抽象父类的子类,我认为一个好方法是在那里(或在接口中)放置一个常量,但后来我意识到在Java中,“常量”实际上是一个“静态”最后“,这意味着我无法覆盖它,所以它不会那样工作。
经验丰富的Java程序员如何做到这一点?
答案 0 :(得分:6)
如果您需要识别“类型”,请定义一个强制类为您提供该类型的接口,然后在任何地方实现该接口。
示例:
public interface IHasType {
public String getTypeId();
}
但是,如果类型列表是固定的,我会更进一步,使类型为Enum
:
public enum MyType {
TYPE_A, TYPE_B;
}
然后返回此enum
而不是String
。
答案 1 :(得分:1)
生产者类可以在方法中封装限制和“其他东西”吗?这样,每个不同的生产者可以相应地实施适当的方法。或者只是让该方法返回某种功能标识符,比如某种类型的枚举。
如果这样做不起作用,比如说如果你想让其他消费者做不同的事情,那么显而易见的解决方案是拥有一堆“if(object instanceof ....)”语句。
我已经做到了两种方式,我不能说在所有情况下都特别“好”。
答案 2 :(得分:0)
首先,我认为您需要明确自己要防范的内容。你在防范恶意代码吗?如果没有,那么只需使用排队的对象。
如果您想要防范恶意代码,那么显而易见的路线就是为每个生产者分配一个入队对象。没有其他生产者能够获得另一个enqueuer,因此您可以信任添加到队列中的任何内容。
答案 3 :(得分:0)
让您的消息对象扩展java.util.EventObject,并让消息生成器将自己设置为消息源。然后,消息使用者可以只对消息调用getSource()并找出发送者。当然,这假设您信任消息生成者正确填充此字段。