我为每个类(StringBuffer和StringBuilder)提供了两个带有重复代码的方法
public void myStringBuffer() {
StringBuffer sBuf=new StringBuffer("stringBuffer");
//some code
}
public void myStringBuilder() {
StringBuilder sBuil=new StringBuilder("stringBuilder");
//some code (same as in first method, duplicated)
}
我想在方法中提取此代码,但我有不同的类
public someCode( Class<T> myStringObject)
这是关于泛型,但是怎么样?
UPD:是的,Generics什么都没有)) 谢谢你的回答。
答案 0 :(得分:4)
他们都实现Appendable
,所以只需将公共代码提取到方法中:
public void myStringBuffer() {
common(new StringBuffer("stringBuffer"));
}
public void myStringBuilder() {
common(new StringBuilder("stringBuffer"));
}
private void common(Appendable appendable) {
// some code.
}
如果您需要其他已实现接口的方法,请使用交集类型:
<T extends CharSequence & Appendable> void common(T t) {
// Some code.
}
答案 1 :(得分:2)
定义一个方法,将参数指定为一个变量,其类型允许调用这两个类所需的方法。
AbstractStringBuilder
和StringBuffer
的直接超类StringBuilder
将是一个非常好的候选者,但你不能使用它,因为它是包私有的。
因此,解决方法是使用Appendable
请注意,Appendable
远非提供StringBuffer和StringBuilder提供的方法的多样性。
因此,这个解决方案可能还不够。
public void myBuilder(Appendable builder) {
//some code
}
并调用它:
StringBuffer sBuf = new StringBuffer("stringBuffer");
myBuilder(sBuf);
StringBuilder sBuil = new StringBuilder("stringBuffer");
myBuilder(sBuil);
答案 2 :(得分:0)
如果您的代码使用Appendable
接口中声明的方法,则可以使用此声明:
public void yourMethod(Appendable value) {
//your code
}
如果还需要CharSequence接口中的方法,则可能需要Object参数。为了确保获得正确的对象,您必须手动检查它们是否实现了正确的接口:
public void yourMethod(Object obj) throws Exception{
if (!(obj instanceof Appendable)) {
throw new Exception("Appendable interface not implemented by the received object"); //or a custom exception would be better
} else if (!(obj instanceof CharSequence)) {
throw new Exception("CharSequence interface not implemented by the received object");
} else {
Appendable app = (Appendable)obj; //use this one to use Appendable methods
CharSequence chSeq = (CharSequence)obj; //use this one to use CharSequence methods
//your code
//e.g.
app.append(" string to append");
int totalLength = chSeq.length(); //would return the length of the resulting string
}
}