有没有办法通过使用泛型来避免instanceof?

时间:2017-03-26 21:32:45

标签: java generics polymorphism

我有一个过程,多个地方可以生成错误消息和成功消息,所以我想用一个类跟踪它们,然后在过程结束时,按照不同的类型对#39进行分组。 ;。 这些方面的东西:

public class Message {
  String message;
  public Message(String message) {
      this.message = message;
  }
}

public class ErrorMessage extends Message {};
public class FileErrorMessage extends ErrorMessage {};
public class OkMessage extends Message {};

等等。 (为了清楚起见,我在派生类中跳过构造函数)。我可以使用 instanceof 运算符区分List,但是我认为泛型会更优雅,但是我如何在List中区分它们?

Message<ErrorMessage> eMsg = new Message<ErrorMessage>("invalid user");
Message<FileErrorMessage> feMsg = new Message<FileErrorMessage>("file not found");

我想过使用枚举

enum MessagType { ERROR, FILE_ERROR, OK }

对于不同的类,但我无法提出解决方案。感谢。

2 个答案:

答案 0 :(得分:3)

在这种情况下你通常可以做的是make Message有一个可以被子类覆盖的函数。然后,在调用该函数时,每个子类都可以拥有自己的行为,或者它可以保留Messages的默认行为。如果没有默认值,则可以将Message设为抽象类。

然后你可以遍历列表并执行以下操作:

for (Message m : messages) {
    m.function();
}

希望这就是你要找的东西!

编辑:在回复下面的评论时,您可以执行以下操作(使用番石榴):

SetMultimap<Class, Message> messagesByType = HashMultimap.create();
for (Message m : messages) {
    messagesByType.add(m.getClass(), m);
}

然后你可以通过messagesByType进行嵌套循环,一次处理一个不同的类型。话虽如此,鉴于我的最初反应,我并没有真正意识到需要做到这一点,但这是回答你的问题。

答案 1 :(得分:2)

在这种情况下使用泛型对我来说毫无意义。如果不同类型的消息具有不同的行为,则使用继承来区分消息的类型是有意义的,但这似乎并非如此。

所以,我只会将消息类型作为enum MessageType { ERROR, FILE_ERROR, OK } public class Message { private final String message; private final MessageType type; public Message(String message, MessageType type) { this.message = message; this.type = type; } public MessageType getType() { return this.type; } // getter for message } 类的属性:

Map<MessageType, Message> messagesByType = messages.stream()
    .collect(Collectors.groupingBy(Message::getType));

一般情况下,您应该保持简单,请参阅KISS principle

修改

如果要按类型对邮件进行分组,可以按以下方式进行分组:

messages

List是包含所有邮件的bot.dialog("/schedule", [ (session, args, next)=>{ builder.Prompts.text(session,"When do you prefer new appoitment"); }, (session,results,next)=>{ session.sendTyping(); builder.LuisRecognizer.recognize(results.response,model, (err,intents,entities)=>{ if(err){ console.log("Some error occurred in calling LUIS"); } console.log(intents); console.log("=================="); console.log(entities); }); } ]);