I'm writing this simple chat room in Java, and I wish to refactor a couple of things, like the following switch statement that should be replaced with polymorphism or at least not rely on another class enum.
Message Object:
public class Message implements Serializable { public enum MessageTypes {PUBLIC_MESSAGE,PTIVATE_MASSAGE,USER_DUPLICATE,USER_LOGOUT,SERVER_LOGOUT,USERSLIST}; private String dest; private String src; private String messageContent; private MessageTypes type; public Message(String source) { src = source; } public Message(String source,String message) { this(source); messageContent = message; type = MessageTypes.PUBLIC_MESSAGE; } public Message(String source,String destination,String message) { this(source); messageContent = message; dest= destination; type = MessageTypes.PTIVATE_MASSAGE; } public String getDest() { return dest; } public String getSrc() { return src; } public String getMessageContent() { return messageContent; } public MessageTypes getType() { return type; } private void setType(MessageTypes typeToSet) { type = typeToSet; } public static Message getServerLogoutMessage() { Message logoutMessage = new Message("Server"); logoutMessage.setType(MessageTypes.SERVER_LOGOUT); return logoutMessage; } public static Message getServerLogoutMessage(String src) { Message logoutMessage = new Message(src); logoutMessage.setType(MessageTypes.SERVER_LOGOUT); return logoutMessage; } public static Message getUserLogoutMessage(String source) { Message logoutMessage = new Message(source); logoutMessage.setType(MessageTypes.USER_LOGOUT); return logoutMessage; } public static Message getUsersListMessage(String source) { Message usersMessage = new Message(source); usersMessage.setType(MessageTypes.USERSLIST); return usersMessage; } public static Message getDuplicateMessage() { Message msg = new Message("Server"); msg.setType(MessageTypes.USER_DUPLICATE); return msg; } @Override public String toString() { return "Source : " + getSrc() + "\n" + "Dest : " + getDest() + "\n" + "Type : " + getType() + "\n" + "Content : " + getMessageContent() + "\n"; } } Function at the server class:
public synchronized void handelMessage(Message msg) { ClientListenerWriterPair p; String src = msg.getSrc(); String content = msg.getMessageContent(); String toWrite; switch (msg.getType()) { case PTIVATE_MASSAGE: sendPrivateMessage(msg); break; case PUBLIC_MESSAGE: toWrite = String.format("%s : %s",src,content); control.writeTextToGui(toWrite); spreadTheMessage(msg); break; case USER_LOGOUT: p = nameToClientHash.remove(msg.getSrc()); p.getListener().close(); p.getWriter().close(); p.getWriter().setMsg(Message.getUserLogoutMessage("Server")); try { p.getWriter().join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } p.close(); break; case SERVER_LOGOUT: p = nameToClientHash.remove(msg.getSrc()); p.getListener().close(); p.close(); break; case USERSLIST: p = nameToClientHash.get(msg.getSrc()); final Set<String> userSet = nameToClientHash.keySet(); break; } }