我有一个问题让我昨晚睡了太久:) 我制作了一个多级类(class),例如:
- 图层
- 图层图像
- 半色调图层
- 图层半色调视频
- 图层半色调图像
方法
- 对象是在settings.java中创建的
- 并添加到“图层”集合列表中。
- 在 main.java 中,我尝试通过 3 种方式聚合它们。
问题
所有聚合都不起作用(读取:给出所需的结果)它们都只循环集合列表的最后一个成员。
我的问题是,我哪里出错了?我需要更改什么才能使其正常工作?
很抱歉代码太长。我已尝试使该插图尽可能紧凑。
控制台结果
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"
));
}
}
Layer.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
);
}
}
最佳答案
如果你看看你的Layer
及其子类:
public abstract class Layer {
static String idReadable;
static boolean runThisLayer;
static String inputPath;
...
}
您会看到它们都有静态
字段。这些字段属于该类,而不属于您创建的类的实例。因此,您创建的不同层将不会具有独立的 idReadable
、runThisLayer
或 inputPath
。每次创建新层时,这些字段都会重置,这就是为什么它们只包含您创建的最后一层的值。
要解决此问题,只需将它们设置为非静态即可:
public abstract class Layer {
String idReadable;
boolean runThisLayer;
String inputPath;
...
}
您还应该考虑将它们设为私有(private)并使用 getter 来获取它们的值。
关于Java - 具有多级类的列表集合 - 仅循环最后一个成员 - .stream() .forEach() .for(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58518475/