2016-08-29 13 views
-2

Mai der Titel ist keine bestimmte, ich weiß nur nicht, wie man es nennt. Ich werde Ihnen im Detail erklärenArrayList der Klasse, erhalten spezifischen Wert in einer anderen Klasse

Ich habe diese Klassen:

public class ChannelComponent { 

    private String name; 
    private String mode; //(1P1C/XPXC/1PXC) 
    private List<SourceProvidedPort> publishers = new ArrayList<SourceProvidedPort>(); 
    private List<SinkRequiredPort> subscribers = new ArrayList<SinkRequiredPort>(); 

    public ChannelComponent(String name, String mode) { 
     this.name = name; 
     this.mode = mode; 
    } 

    public boolean canISubscribe(SinkRequiredPort newPort) { 
     if ((mode.equals("1P1C") || mode.equals("1PXC")) && subscribers.size() < 1) { 
      subscribers.add(newPort); 
      return true; 
     } else if (mode.equals("XPXC")) { 
      subscribers.add(newPort); 
      return true; 
     } 
     return false; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getMode() { 
     return mode; 
    } 

    public void printChannel() { 
     System.out.println("[" + name + "," + mode + "]" + "\n"); 
    } 

} 

TestCentralRegistry

public class TestCentralRegistry { 

    private List<ChannelComponent> channels = new ArrayList<ChannelComponent>(); 

    public void addChannelComponent(ChannelComponent c) { 
     channels.add(c); 
    } 


    public static void main(String... args) { 
     TestCentralRegistry demo = new TestCentralRegistry(); 

     demo.addChannelComponent(new ChannelComponent("channel1", "1P1C")); 
     demo.addChannelComponent(new ChannelComponent("channel2", "XPXC")); 

    } 
} 

Im TestCentralRegistry Klasse I 2 channelComponents erstellt, diese Kanäle möchte ich vergleichen ihr Modus Wert in der Methode canISubscribe (in der ChannelComponent Klasse). Aber wie kommt es, dass ich die in der TestCentralRegistry erstellten Werte abrufen konnte, um sie in der ChannelComponent Klasse zu lesen?

was fehlt mir?

Denn von einer anderen Klasse TestChannel Ich werde eine ChannelComponent Referenz haben, rufen Sie die Methode canISubscribe

public class TestChannel { 
    ChannelComponent channelComponent; 

    public void callSubscribe(SinkRequiredPort newPort){ 
     channelComponent.canISubscribe(newPort); 
    } 

    public static void main(String... args) { 
     TestChannel testChannel = new TestChannel(); 
     SinkRequiredPort sinkPort = new SinkRequiredPort(); 
     sinkPort.setWantsUse("channel1"); 

     testChannel.callSubscribe(sinkPort); 

    } 
} 

Und ich brauche die Werte zu vergleichen, erstellt in der TestCentralRegistry und TestChannel, um zu sehen, ob es eine Übereinstimmung gibt. Ich weiß, dass ich noch einige Zeilen hinzufügen muss, um den Wert aus der newPort.getWantsUse(); und mit dem channelComponent Name vergleichen ... aber ich muss noch den Wert in der

TestCentralRegistry erstellt

ich meine Frage hoffen ist klar Irgendwelche Vorschläge? Vielen Dank im Voraus

+1

Hinweis: A) fange nicht mal an zu bauen wenn (mode.equals ("A") ODER "B" oder "C") - das ist ein Weg zu Desaster B) eine Methode namens ** canISubscribe ** sollte ** niemals ** den ** Zustand ** des zugrunde liegenden Objekts manipulieren: Der Name einer Methode sagt, was sie tut. "canISubscribe" sagt Ihnen nicht, was in der Methode passieren wird. – GhostCat

+0

@GhostCat könnten Sie bitte ein kleines Beispiel schreiben, um zu sehen, wie ich es verbessern kann, bitte – andreahg

+1

Ich habe bereits gesagt: Sie beginnen mit Methodennamen, die Ihnen sagen, was los ist. In Ihrem Fall könnten Sie also "canISubscribe" und "addSubscription" haben. – GhostCat

Antwort

2

Versuchen Sie, einen Verweis auf TestCentralRegistry in ChannelComponent zu halten.

public class ChannelComponent { 

    private String name; 
    private String mode; //(1P1C/XPXC/1PXC) 
    private List<SourceProvidedPort> publishers = new ArrayList<SourceProvidedPort>(); 
    private List<SinkRequiredPort> subscribers = new ArrayList<SinkRequiredPort>(); 
    private TestCentralRegistry testCentralRegistry; 

    public ChannelComponent(String name, String mode) { 
     this.name = name; 
     this.mode = mode; 
    } 

    public void registerTestCentralRegistry(TestCentralRegistry testCentralRegistry) { 
     this.testCentralRegistry = testCentralRegistry; 
    } 
} 

Registrieren TestCentralRegistry wie unten dargestellt:

public class TestCentralRegistry { 

    private List<ChannelComponent> channels = new ArrayList<ChannelComponent>(); 

    public void addChannelComponent(ChannelComponent c) { 
     channels.add(c); 
    } 

    public static void main(String... args) { 
     TestCentralRegistry demo = new TestCentralRegistry(); 

     ChannelComponent cc1 = new ChannelComponent("channel1", "1P1C"); 
     cc1.registerTestCentralRegistry(demo); 
     ChannelComponent cc2 = new ChannelComponent("channel2", "XPXC"); 
     cc2.registerTestCentralRegistry(demo); 

     demo.addChannelComponent(cc1); 
     demo.addChannelComponent(cc2); 
    } 
} 

Dann können Sie die Werte in der TestCentralRegistry erstellt abrufen, indem testCentralRegistry.getX() von ChannelComponent aufrufen.

+0

danke @uoyilmaz, ja es macht Sinn, das zu tun! – andreahg

Verwandte Themen