Alternative for exampleOf (status template)

I have a problem with a state template, I don’t know how to check if a Statespecific instance has one without using it instanceOf(because it is considered bad practice).

TCPConnectioncontains the object TCPState. Say I want to get everything TCPConnectionsthat has a fortune TCPEstablished. How should I do it? enter image description here

One could:

public List<TCPConnection> getAllEstablished() {
  List<TCPConnection> list = new ArrayList<TCPConnection>();

  for(TCPConnection tcp : allConnections) {
      if(tcp.getState().instanceOf(TCPEstablished)) {
          list.add(tcp);
      }
  }

  return list;
}

But it uses instanceOf, and I would rather not use it. Are there any better ways? Or is my use instanceOfpermissible?

+4
source share
2 answers

, instanceOf . , ( , , ).

instanceOf, TCPState, . bool isEstablished() , true TCPEstablished.

interface TCPState {
    ...
    boolean isEstablished();
}

class TCPEstablished implements TCPState {
    ...
    boolean isEstablished() {
        return true;
    }
}

class TCPClosed implements TCPState {
    ...
    boolean isEstablished() {
        return false;
    }
}

TCPConnection:

class TCPConnection {
    ...
    boolean isEstablished() {
        return this.getState().isEstablished();
    }
}

getAllEstablished :

List<TCPConnection> getAllEstablished() {
    List<TCPConnection> list = new ArrayList<TCPConnection>();

    for(TCPConnection tcp : allConnections) {
        if(tcp.isEstablished()) {
            list.add(tcp);
        }
    }

    return list;
}

instanceOf . ?

+4

public enum TCPState{
  ESTABLISHED,
  LISTEN,
  CLOSED;

  ..methods go here

}

, . equals() == .

for(TCPConnection tcp : allConnections) {
  if(tcp.getState()==TCPState.Established)) {
      list.add(tcp);
  }
}

, , .

, TCPState foo()

public enum TCPState{
  ESTABLISHED,
  LISTEN,
  CLOSED;

 public abstract void foo();

}

- :

 public enum TCPState{
  ESTABLISHED{
     @Override
     public void foo(){
         System.out.println("established");
     }
  },
  LISTEN{
     @Override
     public void foo(){
         System.out.println("listening");
     }
  },
  CLOSED{
     @Override
     public void foo(){
         System.out.println("closed");
     }
  }
  ;

 public abstract void foo();

}

TCPSTate abstract, , - .

+2

Source: https://habr.com/ru/post/1584338/


All Articles