2017-04-25 3 views
0

je codes écrit quelque chose comme ci-dessous:chercher des conseils pour plus élégante façon d'initialiser la variable super-classe de sous classe

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 
} 

J'ai vraiment besoin à trois niveaux et étend ce code fonctionne bien. Mais je pense que la façon d'initialiser la variable d'instance de super classe (zmqPort, zmqIp, zmqTopic) n'est pas élégante, je ne peux pas dire exactement pourquoi je pense que la partie n'est pas élégante, mais je suis juste "Feeling" c'est pas juste quand je regarde le code, peut-être c'est à cause du code dupliqué dans la méthode init() ...

Quelqu'un pourrait-il suggérer une architecture plus élégante?

grâce

+0

Si ce code fonctionne correctement, vous devez le soumettre sur notre [Code Review] (https: //codereview.stackexchange. com /) site de la soeur. –

+0

Le 'init' et super' init' semble être le même code –

+0

@Scary Wombat désolé, il y avait une partie manquante dans mon code précédent, maintenant je les ai raffinés, pourriez-vous vérifier à nouveau? merci –

Répondre

0

J'ai une suggestion, vous classe SensorCollector est le nom de la variable ombrage de parent, ce qui est une mauvaise pratique. Cela conduit à la confusion.

Je pense que vous pouvez nettoyer votre code comme ceci en évitant la shadowing variable:

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(); 
    } 
}