簡體   English   中英

設計Java接口:具有可變數量參數的方法

[英]Design a Java interface: a method with variable numbers of parameters

我剛剛遇到了設計接口的問題,該接口的方法可能具有可變數量的輸入參數。

public interface FoobarSerialization<T> {
    Foobar serialize(T obj); 
}

問題是,對於實現此接口的類,它們需要不同數量的輸入參數。

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) {
        //...
    }
}

有沒有好的設計或任何真正的方法來解決這個問題? 我知道界面中的方法可以聲明為:

Foobar serialize(T... obj); 

但我不確定這是一個設計這樣的界面的好習慣。

任何想法?

更新 :我使用接口的意圖來自需要為不同目的進行序列化和反序列化的類集合。 它們作為同一域下的組件。 但是它們的序列化方法是完全不同的,特別是考慮到它們對不共享任何共同特征或類的對象和服務的依賴性。

我想這里要問的正確問題是:在設計方面,當退出一組具有相同行為(序列化,反序列化,doSomething等)但具有不同輸入參數的類時,最好的方法是什么?

救援的組成模式。

在您的特定情況下,我將創建僅接受1個參數的接口:

public interface Serializer<T> {

    Foobar serialize(T object);

}

現在,如果需要序列化多個字段,只需創建一個包含序列化所需字段的對象:

class FoobarBundle {

    String stringField;
    int intField;
    byte[] arrayField;

    /* ... */

}

並編寫一系列序列化器: FoobarBundleSerializerStringSerializerIntegerSerializerByteArraySerializer 最后將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);
    }

}

您的里程可能會有所不同,但應避免使用同名方法的混亂 (例如相同數量但不同類型的參數)。 雖然可以采用方法重載的幫助,但它被認為是不可取的。 如果參數列表是可管理的,則應以不同方式命名方法以避免歧義。 參見Effective Java 2中的第26項

vararg方法沒問題,但在Java中,最佳實踐是指定至少一個具體參數,后跟可變數量的相同類型的參數。 這可能不適用於您的情況,因為對於像public Foobar serialize(FoobarB obj, Date date, String str);這樣的方法沒有vararg語法public Foobar serialize(FoobarB obj, Date date, String str); 使用類似(Object ... objects)的語法可能是可以接受的,但這種做法通常適用。

將此與printf類的方法進行對比,該方法可以並且應該能夠將任意類型的可變數量的參數(包括基元)輸出到輸出流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM