设计Java接口:一种参数数目可变的方法
我在设计一个接口时遇到了一个问题,这个接口的方法可能有数量可变的输入参数设计Java接口:一种参数数目可变的方法,java,parameters,interface,Java,Parameters,Interface,我在设计一个接口时遇到了一个问题,这个接口的方法可能有数量可变的输入参数 public interface FoobarSerialization<T> { Foobar serialize(T obj); } 但是我不确定设计这样的界面是否是一个好的实践 有什么想法吗 更新:我使用接口的意图来自于需要序列化和反序列化以用于不同目的的类集合。它们作为同一域下的组件。但它们的序列化方法却截然不同,特别是考虑到它们对不共享任何公共特性或类的对象和服务的依赖性 我想这里要问的正
public interface FoobarSerialization<T> {
Foobar serialize(T obj);
}
但是我不确定设计这样的界面是否是一个好的实践
有什么想法吗
更新:我使用接口的意图来自于需要序列化和反序列化以用于不同目的的类集合。它们作为同一域下的组件。但它们的序列化方法却截然不同,特别是考虑到它们对不共享任何公共特性或类的对象和服务的依赖性
我想这里要问的正确问题是:就设计而言,当存在一组具有相同行为(序列化、反序列化、doSomething等)但具有不同输入参数的类时,最好的方法是什么?您的里程可能会有所不同,但通常会混淆用法(例如,相同的数量,但参数类型不同)应避免使用具有相同名称的方法。虽然可以借助方法重载,但它被认为不太理想。如果参数列表是可管理的,那么应该以不同的方式命名方法以避免歧义。看 vararg方法是可以的,但在Java中,最佳实践是指定至少一个具体参数,后跟相同类型的可变数量的参数。这可能不适用于您的情况,因为像
public Foobar serialize(foobbarb obj,Date-Date,String-str)这样的方法没有vararg语法代码>。使用类似于(Object…objects)
的语法可能是可以接受的,但这种做法并不普遍适用
与之相比,像printf
这样的方法可以并且应该能够向输出流输出任意类型(包括原语)的可变数量的参数。合成模式
在您的特殊情况下,我将创建只接受1个参数的接口:
public interface Serializer<T> {
Foobar serialize(T object);
}
并编写一组序列化程序:FoobarBundleSerializer
,StringSerializer
,IntegerSerializer
,bytearrayseriizer
。最后,在FoobarBundleSerializer
中组合所有序列化程序,如下所示:
class FoobarBundleSerializer implements Serializer<FoobarBundle> {
StringSerializer stringSerializer;
IntegerSerializer integerSerializer;
ByteArraySerializer byteArraySerializer;
/* constructor here */
@Override
public Foobar serialize(FoobarBundle bundle) {
Foobar foobarString = stringSerializer.serialize(bundle.stringField);
Foobar foobarInteger = integerSerializer.serialize(bundle.intField);
Foobar foobarByteArray = byteArraySerializer.serialize(bundle.byteArrayField);
return combineFoobarSomehow(foobarString, foobarInteger, foobarByteArray);
}
}
类FoobarBundleSerializer实现序列化程序{
StringSerializer StringSerializer;
整合器串联器;
ByteArrealizer ByteArrealizer;
/*这里是构造器*/
@凌驾
公共Foobar序列化(foobubundle包){
Foobar foobarString=stringSerializer.serialize(bundle.stringField);
Foobar foobarInteger=integerSerializer.serialize(bundle.intField);
Foobar foobarByteArray=byteArraySerializer.serialize(bundle.byteArrayField);
返回组合obarsomehow(foobarString、foobarInteger、foobarByteArray);
}
}
这不是你应该拥有的界面。拥有一个接口的意义在于,如果你有一个接口实例,你应该总是能够用相同的参数调用它,而这里的情况并非如此。@LouisWasserman同意。在这种情况下使用接口似乎不是一个好主意。那么这里最好用什么?最好什么都不用。直接编写方法;不要尝试任何花哨的魔法。
public interface Serializer<T> {
Foobar serialize(T object);
}
class FoobarBundle {
String stringField;
int intField;
byte[] arrayField;
/* ... */
}
class FoobarBundleSerializer implements Serializer<FoobarBundle> {
StringSerializer stringSerializer;
IntegerSerializer integerSerializer;
ByteArraySerializer byteArraySerializer;
/* constructor here */
@Override
public Foobar serialize(FoobarBundle bundle) {
Foobar foobarString = stringSerializer.serialize(bundle.stringField);
Foobar foobarInteger = integerSerializer.serialize(bundle.intField);
Foobar foobarByteArray = byteArraySerializer.serialize(bundle.byteArrayField);
return combineFoobarSomehow(foobarString, foobarInteger, foobarByteArray);
}
}