2016-08-05 2 views
1

Рассмотрим следующий класс, где я перезапись OutputStreamКаков наилучший способ инициализации следующего экземпляра в моем классе?

public class MyOutputStream extends java.io.OutputStream { 
    public String clientId = null; 
    public String fileId = null; 
    public String filelocation = null; 
    public DBClient clientobj = null; 
    public OuputStream out = null; 

    public MyOuputStream(String clientid, String fileid, String filelocation) { 
     this.clientid = clientid; 
     this.fileid = fileid; 
     this.filelocation = filelocation; 
    } 

    public void write(byte[] bytes) throws IOException { 
     out.write(bytes); 
    } 

    private DBClient getInstance(String clientid, String fileid) throws DBClientException { 
     return this.clientobj = DBClient.getInstance(clientid, fileid); 
    } 

    private OutputStream getOuputStream(DFSClient clientobj) throws Exception { 
     return this.out = clientobj.getOutputStream(); 
    } 
} 

В приведенном выше коде, чтобы написать с помощью MyOuputStream в объект DBClient и OuputStream должен быть инициализирован перед операцией записи

Кто-то, пожалуйста, предложите мне подходящую схему проектирования, чтобы решить эту проблему.

+1

Я не уверен, почему вы распространяете 'java.io.OutputStream' для начала, если вы собираетесь просто создать другое поле« OutputStream »и использовать его методы экземпляра. Что касается вашего вопроса, то все, что должно быть инициализировано до вызова методов экземпляра, должно быть включено в конструктор объекта. – Nerdizzle

ответ

1

Предполагая, что вы хотите MyOutputStream перенаправлять весь вывод в OutputStream извлеченного из DBClient объекта, вы хотите расширить FilterOutputStream, так что вы получите все реализации делегата бесплатно.

Чтобы использовать его, вы должны предоставить OutputStream от DBClient конструктору FilterOutputStream, поэтому вам необходимо подготовить данные в статическом методе.

public class MyOutputStream extends FilterOutputStream { 

    private String clientId; 
    private String fileId; 
    private String fileLocation; 
    private DBClient clientobj; 

    public static MyOutputStream create(String clientId, String fileId, String fileLocation) { 
     DBClient clientobj = DBClient.getInstance(clientId, fileId); 
     return new MyOutputStream(clientId, fileId, fileLocation, clientobj); 
    } 

    private MyOutputStream(String clientId, String fileId, String fileLocation, DBClient clientobj) { 
     super(clientobj.getOutputStream()); 
     this.clientId = clientId; 
     this.fileId = fileId; 
     this.fileLocation = fileLocation; 
     this.clientobj = clientobj; 
    } 

} 

Теперь, вместо написания new MyOuputStream(clientId, fileId, fileLocation), вы пишете MyOuputStream.create(clientId, fileId, fileLocation).

Смежные вопросы