设计Java接口:具有可变数量参数的方法

Jer*_*Yeh 4 java parameters interface

我刚刚遇到了设计接口的问题,该接口的方法可能具有可变数量的输入参数.

public interface FoobarSerialization<T> {
    Foobar serialize(T obj); 
}
Run Code Online (Sandbox Code Playgroud)

问题是,对于实现此接口的类,它们需要不同数量的输入参数.

public class FoobarA implements FoobarSerialization<FoobarA> {
    @Override
    public Foobar serialize(FoobarA obj, int bar) {
        //...
    }
}


public class FoobarB implements FoobarSerialization<FoobarB> {
    @Override
    public Foobar serialize(FoobarB obj, Date date, String str) {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有好的设计或任何真正的方法来解决这个问题?我知道界面中的方法可以声明为:

Foobar serialize(T... obj); 
Run Code Online (Sandbox Code Playgroud)

但我不确定这是一个设计这样的界面的好习惯.

任何想法?

更新:我使用接口的意图来自需要为不同目的进行序列化和反序列化的类集合.它们作为同一域下的组件.但是它们的序列化方法是完全不同的,特别是考虑到它们对不共享任何共同特征或类的对象和服务的依赖性.

我想这里要问的正确问题是:在设计方面,当退出一组具有相同行为(序列化,反序列化,doSomething等)但具有不同输入参数的类时,最好的方法是什么?

Dmi*_*sev 5

救援的组成模式.

在您的特定情况下,我将创建仅接受1个参数的接口:

public interface Serializer<T> {

    Foobar serialize(T object);

}
Run Code Online (Sandbox Code Playgroud)

现在,如果需要序列化多个字段,只需创建一个包含序列化所需字段的对象:

class FoobarBundle {

    String stringField;
    int intField;
    byte[] arrayField;

    /* ... */

}
Run Code Online (Sandbox Code Playgroud)

而写一串序列化的:FoobarBundleSerializer,StringSerializer,IntegerSerializer,ByteArraySerializer.最后将所有序列化器组合在一起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);
    }

}
Run Code Online (Sandbox Code Playgroud)