2017-04-25 4 views
0

からスーパークラスの変数を初期化するよりエレガントな方法について助言を求める:私はコードを下に書かれている以下のようなもののサブクラス

abstract class ZmqSubscriber { 
    protected String zmqPort, zmqIp, zmpTopic; 
    public void start() { 
     init(); 
     // connect to zeroMQ with initialized zmq port, ip, topic and receive data 
    } 
    abstract protected void init(); 
} 

abstract class Collector extends ZmqSubscriber { 
    @Override 
    protected void init() { 
     super.zmqIp = this.zmqIp; 
     super.zmqPort = this.zmqPort; 
     super.zmqTopic = this.zmqTopic; 
    } 
    public void otherMethod() { //blablabla } 
} 

class Syncronizer extends ZmqSubscriber() { 
    //blablabla 
} 

class SensorCollector extends Collector { 
    private String zmqPort, zmqIp, zmpTopic; 
    @Override 
    protected void init() { 
     //this.zmqIp, this.zmpPort, this.zmqTopic will be already initialized at this moment 
     super.zmqIp = this.zmqIp; 
     super.zmqPort = this.zmqPort; 
     super.zmqTopic = this.zmqTopic; 
     super.init(); 
    } 
    // getters & setters for zmq port, ip, topic 
} 
class BeconCollector extends Collector { 
    // blablabla like SensorCollector 
} 

を私は間違いなく3レベルが延び必要と、このコードがうまく実行されています。 しかし、私は、スーパークラスのインスタンス変数(zmqPort、zmqIp、zmqTopic)をサブクラスで初期化する方法がエレガントではないと思います。なぜ私はその部分がエレガントではないと思うのか正確には言えませんが、私がコードを見ていると正しくないのでしょうか?おそらく、init()メソッドのコードが重複しているからです...

もっとエレガントなアーキテクチャをお考えですか?

おかげ

+0

場合は、あなたが私たちの[コードレビュー](HTTPS上でそれを提出してください。 com /)姉妹サイト。 –

+0

'init'とスーパー' init'は同じコードのようです –

+0

@Scary Wombat申し訳ありません、私の前のコードには欠けていた部分がありましたが、今度はそれらを洗練しました。ありがとうございます –

答えて

0

は、私は1つの提案を持っている、あなたクラスSensorCollectorは悪い習慣である親の変数名を、シャドウイングされます。それは混乱につながります。

は、私はあなたが変数シャドウイングを回避することにより、このようなコードをきれいにすることができると思う://codereview.stackexchange:このコードは正常に動作します

abstract class ZmqSubscriber { 
    protected String zmqPort, zmqIp, zmpTopic; 
    public void start() { 
     // connect to zeroMQ with initialized zmq port, ip, topic and receive data 
     System.out.println("connecting :" + zmqIp + ":" + zmqPort + " for topic : " + zmpTopic); 
    } 

    // some abstract method... 
} 

class SensorCollector extends ZmqSubscriber { 

    public SensorCollector(String zmqPort, String zmqIp, String zmpTopic) { 
    this.zmqPort = zmqPort; 
    this.zmqIp = zmqIp; 
    this.zmpTopic = zmpTopic; 
    } 

    // implementation for some abstract method... 
} 

public class Main { 
    public static void main(String[] args) { 
    SensorCollector sensorCollector = new SensorCollector("8080", "0.0.0.0", "zeroMQ"); 
    sensorCollector.start(); 
    } 
} 
関連する問題