Java - коллекция списков с многоуровневыми классами - только циклы последний член - .stream () .forEach () .for () - PullRequest
0 голосов
/ 23 октября 2019

У меня есть вопрос, который долго не давал мне спать прошлой ночью :) Я создал многоуровневый класс, такой как:

  • Layer
    • LayerImage
    • LayerHalftone
      • LayerHalftoneVideo
      • LayerHalftoneImage

Подход

  • Theобъекты создаются в файле settings.java
  • и добавляются в список коллекции слоев.
  • В файле main.java я пытаюсь объединить их тремя способами.

Проблема

Ни одна из совокупностей не работает (читай: дайте желаемый результат) Все они только зацикливают последний элемент списка сбора.

Мой вопрос будет, где я могу пойти не так? Что мне нужно изменить, чтобы это заработало?

Извините за длинный код. Я попытался сделать его максимально компактным для этой иллюстрации.

Результат консоли

5
[LayerHalftoneVideo@61bbe9ba, LayerHalftoneVideo@610455d6, LayerHalftoneVideo@511d50c0, LayerHalftoneImage@60e53b93, LayerImage@5e2de80c]
LayerHalftoneVideo@511d50c0
title 01

.forEach()
title 01
title 01
title 01
title 01
title 01

.stream()
title 01
title 01
title 01
title 01
title 01

.for()
title 01
title 01
title 01
title 01
title 01

Требуемый результат консоли

(для каждого типа цикла)

smoke
video 01
video 02
image 01
title 01

main.java

public class main {

    public static void main(String[] args) {

        // debug to see amount of elements in list
        System.out.println( settings.layers.size() );
        System.out.println( settings.layers );
        System.out.println( settings.layers.get(2) );
        System.out.println( settings.layers.get(2).idReadable );

        System.out.println( "\n.forEach() ");
        settings.layers.forEach( layer -> {
            System.out.println( layer.idReadable);
        });

        System.out.println( "\n.stream() ");
        settings.layers
                .stream()
                .forEach( layer -> {
                    System.out.println( layer.idReadable);
                });

        System.out.println( "\n.for() ");
        for (Layer layer : settings.layers) {
            System.out.println( layer.idReadable );
        }
    }
}

settings.java

import java.util.ArrayList;
import java.util.List;

public class settings extends main {

    public static List<Layer> layers = new ArrayList<>();

    static {

        layers.add(new LayerHalftoneVideo(
                "smoke",
                false,
                "video/smoke_02.mp4",
                1000,
                1414,
                1,
                0,
                30,
                50,
                0,
                new int[] { 255,255,255 },//color_03,
                30,
                1.0f
        ));

        layers.add(new LayerHalftoneVideo(
                "video 01",
                true,
                "video/01.mp4",
                1000,
                1414,
                1,
                0,
                40,
                80,
                1,
                new int[] { 255,255,255 },//color_02,
                30,
                1.0f
        ));

        layers.add(new LayerHalftoneVideo(
                "video 02",
                true,
                "video/02.mp4",
                1000,
                1414,
                1,
                0,
                0,
                100,
                1,
                new int[] { 255,255,255 },//color_00,
                30,
                1.0f
        ));

        layers.add(new LayerHalftoneImage(
                "image 01",
                false,
                "illustration/1.jpg",
                1000,
                1414,
                1,
                0,
                20,
                80,
                1,
                new int[] { 255,255,255 }//color_02
        ));

        layers.add(new LayerImage(
                "title 01",
                true,
                "image/title_01.png"
        ));

    }
}

Слой. Java

public abstract class Layer {

    static String    idReadable;
    static boolean   runThisLayer;
    static String    inputPath;

    public Layer(
            String  _idReadable,
            boolean _runThisLayer,
            String  _inputPath
    ) {
        idReadable      = _idReadable;
        runThisLayer    = _runThisLayer;
        inputPath       = _inputPath;
    }

}

LayerImage.java

public class LayerImage extends Layer {

    public LayerImage(
            String  _idReadable,
            boolean _runThisLayer,
            String  _inputPath
    ) {
        super(
                _idReadable,
                _runThisLayer,
                _inputPath
        );
    }

}

LayerHalftone.java

public class LayerHalftone extends Layer {

    static int       inputWidth;
    static int       inputHeight;
    static int       patternOffset;
    static int       patternSkipEach;
    static int       patternAngleRadian;
    static int       patternBlockAmount;
    static int       patternNumber;
    static int[]     patternColor;

    public LayerHalftone(
            String  _idReadable,
            boolean _runThisLayer,
            String  _inputPath,
            int     _inputWidth,
            int     _inputHeight,
            int     _patternOffset,
            int     _patternSkipEach,
            int     _patternAngleRadian,
            int     _patternBlockAmount,
            int     _patternNumber,
            int[]   _patternColor
    ) {
        super(
                _idReadable,
                _runThisLayer,
                _inputPath
        );

        inputWidth          = _inputWidth;
        inputHeight         = _inputHeight;
        patternOffset       = _patternOffset;
        patternSkipEach     = _patternSkipEach;
        patternAngleRadian  = _patternAngleRadian;
        patternBlockAmount  = _patternBlockAmount;
        patternNumber       = _patternNumber;
        patternColor        = _patternColor;
    }
}

LayerHalftoneVideo.java

public class LayerHalftoneVideo extends LayerHalftone {

    public static int       videoTimeStart;
    public static float     videoTimeSpeed;

    public LayerHalftoneVideo(
            String  _idReadable,
            boolean _runThisLayer,
            String  _inputPath,
            int     _inputWidth,
            int     _inputHeight,
            int     _patternOffset,
            int     _patternSkipEach,
            int     _patternAngleRadian,
            int     _patternBlockAmount,
            int     _patternNumber,
            int[]   _patternColor,
            int     _videoTimeStart,
            float   _videoTimeSpeed
    ) {
        super(
                _idReadable,
                _runThisLayer,
                _inputPath,
                _inputWidth,
                _inputHeight,
                _patternOffset,
                _patternSkipEach,
                _patternAngleRadian,
                _patternBlockAmount,
                _patternNumber,
                _patternColor
        );

        videoTimeStart  = _videoTimeStart;
        videoTimeSpeed  = _videoTimeSpeed;
    }

}

LayerHalftoneImage.java

public class LayerHalftoneImage extends LayerHalftone {

    public LayerHalftoneImage(
            String  _idReadable,
            boolean _runThisLayer,
            String  _inputPath,
            int     _inputWidth,
            int     _inputHeight,
            int     _patternOffset,
            int     _patternSkipEach,
            int     _patternAngleRadian,
            int     _patternBlockAmount,
            int     _patternNumber,
            int[]   _patternColor
    ) {
        super(
                _idReadable,
                _runThisLayer,
                _inputPath,
                _inputWidth,
                _inputHeight,
                _patternOffset,
                _patternSkipEach,
                _patternAngleRadian,
                _patternBlockAmount,
                _patternNumber,
                _patternColor
        );
    }

}

1 Ответ

1 голос
/ 23 октября 2019

Если вы посмотрите на Layer и его подклассы:

public abstract class Layer {

    static String    idReadable;
    static boolean   runThisLayer;
    static String    inputPath;
    ...
}

Вы увидите, что все они имеют поля static. Эти поля принадлежат классу, а не экземплярам создаваемого вами класса. Поэтому различные создаваемые вами слои не будут иметь независимых idReadable, runThisLayer или inputPath s. Каждый раз, когда создается новый слой, эти поля сбрасываются, поэтому они содержат только значения последнего созданного вами слоя.

Чтобы это исправить, просто сделайте их нестатичными:

public abstract class Layer {

    String    idReadable;
    boolean   runThisLayer;
    String    inputPath;
    ...
}

Вам также следует подумать о том, чтобы сделать их приватными и использовать вместо них получатели, чтобы получить их значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...