使用Java泛型重载(和减少)方法

使用Java泛型重载(和减少)方法,java,oop,generics,methods,overloading,Java,Oop,Generics,Methods,Overloading,我必须为我的面向对象编程类创建一个记录器,我在方法重载和Java泛型方面遇到了困难。我几乎可以肯定我的方法中的逻辑是正确的。但是,我的指导老师要求我们调用writeLogMsg方法,使其在一个方法中只能调用一次。我需要帮助做这件事,因为我对泛型相对不熟悉,并且已经尝试研究了一段时间,但进展甚微。这些方法用于打印带有控制台或调用程序给定的任何值的记录器消息 public void logMsg(Message msgLvl, String msg){ writeLogMsg(getMs

我必须为我的面向对象编程类创建一个记录器,我在方法重载和Java泛型方面遇到了困难。我几乎可以肯定我的方法中的逻辑是正确的。但是,我的指导老师要求我们调用writeLogMsg方法,使其在一个方法中只能调用一次。我需要帮助做这件事,因为我对泛型相对不熟悉,并且已经尝试研究了一段时间,但进展甚微。这些方法用于打印带有控制台或调用程序给定的任何值的记录器消息

 public void logMsg(Message msgLvl, String msg){

    writeLogMsg(getMsgLvlString(msgLvl) + msg);
}

public <T> void logMsg(Message msgLvl, String msg, T val){

    writeLogMsg(getMsgLvlString(msgLvl) + String.format(msg, val));
}

public <T,T2> void logMsg(Message msgLvl, String msg, T val, T2 val2){

    writeLogMsg(getMsgLvlString(msgLvl) + String.format(msg, val, val2));

}

public <T,T2,T3> void logMsg(Message msgLvl, String msg, T val, T2 val2, T3 val3){

    writeLogMsg(getMsgLvlString(msgLvl) + String.format(msg, val, val2, val3));

}

public <T,T2,T3,T4> void logMsg(Message msgLvl, String msg, T val, T2 val2, T3 val3, T4 val4){

    writeLogMsg(getMsgLvlString(msgLvl) + String.format(msg, val, val2, val3, val4));

}
public void logMsg(消息msgLvl,字符串msg){
writeLogMsg(getMsgLvlString(msgLvl)+msg);
}
public void logMsg(消息msgLvl、字符串msg、T val){
writeLogMsg(getMsgLvlString(msgLvl)+String.format(msg,val));
}
公共无效日志消息(消息msgLvl、字符串消息、T val、T2 val2){
writeLogMsg(getMsgLvlString(msgLvl)+String.format(msg,val,val2));
}
公共无效日志消息(消息msgLvl、字符串消息、T val、T2 val2、T3 val3){
writeLogMsg(getMsgLvlString(msgLvl)+String.format(msg,val,val2,val3));
}
公共无效日志消息(消息msgLvl、字符串消息、T val、T2 val2、T3 val3、T4 val4){
writeLogMsg(getMsgLvlString(msgLvl)+String.format(msg,val,val2,val3,val4));
}

您在那里做的事情不需要泛型:因为
String.format
的参数是
String,Object…
,所以您可以简单地使用
Object
而不是
t
T1
T2
等。对于这一点,您可以使用
logMsg(Message msgLvl,String msg,Object…vals)
。使用变量形式而不是1、2、3、4 arg重载对性能有轻微影响;编写1个方法而不是多个重载的便利性平衡了这一点。同时,既然您正在学习,那么msgLvl和msg是什么意思?我想它的意思是“messageLevel”和message。如果将变量命名为“messageLevel”和“message”,不是会更清楚吗?为什么消息类型为String,消息级别类型为message?如果是消息级别,那么类应该命名为“级别”或“消息级别”,而不是消息。这听起来可能很挑剔,但拥有可读的、可维护的代码是绝对关键的。另一方面,您的方法可以命名为“log()”。很明显,您记录的是一条消息。如果它不是,那么它应该被命名logMessage@AndyTurner我需要能够记录最多4个变量的消息…使用您提供的解决方案,我仍然能够做到这一点?@Stef您将能够记录任何变量(实际)变量的数量。您不需要在那里执行泛型操作:因为
String.format
的参数是
String,Object…
,所以您可以简单地使用
Object
而不是
t
T1
T2
等。因此,您可以使用
logMsg(Message msgLvl、String msg、Object…vals)
。使用变量形式而不是1、2、3、4 arg重载会对性能造成轻微影响;编写1个方法而不是多个重载的便利性平衡了这一点。varargs到sacue同样,既然您正在学习,msgLvl和msg是什么意思?我假设它的意思是“messageLevel”如果变量被命名为“messageLevel”和“message”,那不是更清楚了吗?为什么message的类型是String,messageLevel的类型是message?如果是messageLevel,那么类应该被命名为“level”或“messageLevel”,而不是消息。这听起来可能很挑剔,但拥有可读、可维护的代码是绝对关键的。另一方面,您的方法可以命名为“log()。很明显,您记录的是一条消息。如果不是,则应将其命名logMessage@AndyTurner我需要能够记录多达4个变量的消息…使用您提供的解决方案,我仍然能够做到这一点?@Stef您将能够记录任意(实际)数量的变量。