Где объявить ArrayList, если я хочу динамически его заполнять

Anna F спросил: 28 марта 2018 в 04:05 в: java

У меня есть Java-сервер, я хочу сохранить весь IP-адрес, который отправляет запросы на сервер, потому что я хочу проверить, был ли пользователь уже здесь, и если бы он был, я хочу отправить ему еще одно сообщение.

В этом случае метод sendStaticResource должен сделать это.

Для этого я хочу использовать ArrayList ips, который я буду проверять каждый раз , когда запрос приходит. Моя проблема в том, что значения (IP) не будут храниться - каждый раз, когда запрос выполняется, старый IP исчезает (поэтому длина всегда 1).

Итак, вопрос в том, где и как можно Я инициализирую ArrayList, поэтому каждый раз, когда запрос выполняется, ip идет в Arraylist, а старый не исчезает

public class Response {
      Request request;
      OutputStream output;      ArrayList<String> ips = new ArrayList<String>();      public Response(OutputStream output) {        this.output = output;
      }      public void setRequest(Request request) {        this.request = request;
      }      public String getIp() {
        InetAddress thisIp = null;
        try {
           thisIp = InetAddress.getLocalHost();
        } catch (Exception e) {
          System.out.println(e.toString() );
        }
        return thisIp.getHostAddress();
      }      public void content(String header, int contentLength, String msg ) throws IOException  {
        System.out.println(msg);
        String message  = "HTTP/1.1" + header + "\r\n" +
                "Content-Type: text/html\r\n" +
                "Content-Length: "+ contentLength + "\r\n" +
                "\r\n" +
                "<h1>" + msg + "</h1>";
        try {
          output.write(message.getBytes());
          output.flush();
        } catch (Exception e) {
          System.out.println(e.toString());
        }
      }      public void sendStaticResource() throws IOException {
          if(request.getUri().equals("/")) {
            content("200 OK", 20, "Hello world");
            ips.add (getIp());
            System.out.println(ips.size());
          } 
       }
    }

1 ответ

Есть решение
Aris ответил: 28 марта 2018 в 04:19

Я полагаю, что при каждом запросе вы создаете новый объект Response. Поскольку список ips является членом экземпляра объекта Response, каждый раз, когда вы создаете его новый экземпляр, вы также создаете новый список ips.

Если вы хотите иметь список строк, хранящих все ips запросов, которые вы получили, я предлагаю вам изменить код таким образом, чтобы список ip был статическим полем Response object.

Таким образом, вы получите что-то общее для всех объектов класса Response, а не что-то уникальное для каждого экземпляра. Для получения дополнительной информации я бы предложил проверить различия между экземпляром и статическими членами класса. Более подробную информацию вы можете найти здесь: https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

Наконец, небольшая подсказка относительно стиля кода и лучших практик вращается вокруг этой строки:

ArrayList<String> ips = new ArrayList<String>();

Я настоятельно рекомендую пользователю что-то вроде этого:

List<String> ips = new ArrayList<String>();

По моему честному мнению, гораздо лучше кодировать и взаимодействовать, чем конкретную реализацию.