在Java中,消息生产者应该如何识别自己?

在Java中,消息生产者应该如何识别自己?,java,design-patterns,Java,Design Patterns,我有一个统一消息对象队列,其中有多个生产者和一个消费者。消费者正在发布信息,需要能够根据数据的来源授予访问权限,因此我希望生产者在发送消息时发送合适的标识符。生产商自己不能对远端访问限制负责 id应与我的应用程序中制作人的角色相关。我想强制所有生产者必须定义一个,并且子类生产者可以选择继承或重新定义它。producer的类名是一个很好的近似值,但是我想要识别的属性并不是类结构中真正固有的,而是我定义的东西 我可以使用反射来查找类名或接口名,但这会带来太多的开销。另外,我不确定合适的房产是什么 由

我有一个统一消息对象队列,其中有多个生产者和一个消费者。消费者正在发布信息,需要能够根据数据的来源授予访问权限,因此我希望生产者在发送消息时发送合适的标识符。生产商自己不能对远端访问限制负责

id应与我的应用程序中制作人的角色相关。我想强制所有生产者必须定义一个,并且子类生产者可以选择继承或重新定义它。producer的类名是一个很好的近似值,但是我想要识别的属性并不是类结构中真正固有的,而是我定义的东西

我可以使用反射来查找类名或接口名,但这会带来太多的开销。另外,我不确定合适的房产是什么

由于所有生产者都是同一个抽象父类的子类,我认为一个好方法是在其中(或在接口中)放置一个常量,但后来我意识到在Java中,“常量”实际上是一个“静态final”,这意味着我不能重写它,所以它不能这样工作

一个更有经验的Java程序员如何做到这一点?

如果有一个“类型”需要识别,请定义一个接口,强制类为您提供该类型,然后在任何地方实现该接口

例如:

public interface IHasType {
   public String getTypeId();
}
但是,如果类型列表是固定的,我会更进一步,将类型设置为
Enum

public enum MyType {
   TYPE_A, TYPE_B;
}

然后返回这个
enum
而不是
String

生产者类是否可以将限制和“其他内容”封装在自己的方法中?这样,每个不同的生产者都可以相应地实施适当的方法。或者让该方法返回某种类型的功能标识符,比如某种类型的枚举

如果这不起作用,比如说如果你想让其他消费者做不同的事情,那么显而易见的解决方案是使用一堆“If(objectinstanceof…)”语句


我从两个方面都做过,我不能说任何一个在所有情况下都是特别“更好的”。

首先,我认为你需要清楚你想要保护什么。您是否在防范恶意代码?如果不是,则只使用排队对象


如果您想防范恶意代码,那么显而易见的途径是为每个生产者分发一个排队对象。其他生产者不应能够获得其他排队者,因此您可以信任添加到队列中的任何内容。

让您的消息对象扩展java.util.EventObject,并让消息生产者将自身设置为消息源。然后,消息消费者可以对消息调用getSource(),并找出是谁发送的消息。当然,这是假设您相信消息制作人会正确填充此字段。

当您在上面的解释中说“发件人”时,这是与“制作人”相同,还是它们是独立的类?同样的,帖子澄清了这一点,thxI希望消费者对此负责,所以我不能将其放在制作人中。你们可以认为制作人是“不受设计信任的”。不,并没有恶意代码。我的编辑是对Paul Tomblin的回答的回应,如果这可能会引起混乱,我很抱歉。我想让排队的对象告诉消费者它来自哪里,以便正确处理它。我会在帖子中更好地解释它。机制还可以,但我的问题是如何将源代码转换为我需要的信息。源代码是否实现了一个告诉我的接口?我看源代码的类吗?等等。您选择的答案是获取所需信息的好方法,无论是从消息对象本身还是从EventObject源(如果您选择了该方法)。谢谢,Eddie。事实上,有趣的是,答案有时会将问题转向它应该是什么。如果你看一下修订历史,你可以看到我是如何试图接近这一点的。现在我有了一个解决方案,我知道我的问题是什么了。我很高兴我不是唯一一个这么想的人^