Java-for循环类的每个对象

时间:2019-10-22 12:47:07

标签: java

我正在学习编码,目前正在尝试通过最终学习课程来清理大量的代码。我告诉你这只是为了提个醒,我的术语可能仍然不可用:):)

情况

  • 我的代码适用于将在彼此之上绘制的“图层”
  • 有两种类型的层:视频层和图像层。
  • 两种类型的图层都是父类“图层”的子项
  • 它们需要按创建顺序运行

目标

我想为该类的每个项目/对象运行一个代码。

当前代码

import java.util.*;

public class main  {

    public static void main(String[] args){


        // defining the objects
        LayerVideo item01 = new LayerVideo();
        item01.path = "import/01/";

        LayerVideo item02 = new LayerVideo();
        item02.path = "import/02/";

        LayerImage item03 = new LayerImage();
        item03.path = "import/03/";



        // here is the main goal:
        // to run/call each object from class "Layer"

        // "allLayers" does not exist, but that's what I don't know how to do.
        allLayers.forEach( item ->{
            System.out.println( item.path );
            // expected result in console:
            // import/01/
            // import/02/
            // import/03/
        });

    }

    public static class Layer {

    }

    public static class LayerVideo  extends Layer {
        public String path;
    }

    public static class LayerImage  extends Layer {
        public String path;
    }
}

想法

  • 如何从一个类中获取所有切除对象
  • 如果我有它们,如何通过var name标识它们?
  • 我可以对对象进行循环排序/过滤吗?

3 个答案:

答案 0 :(得分:3)

两件事:

  • 考虑将您的课程设为顶级课程。因此,请不要public static class LayerVideo 进入内部学习。如果它们非常重要,则每个类都应放入其自己的 Java文件中。
  • 然后了解有关Java collections到组织对象实例的知识。例如,您可以定义使用 ArrayList

除此之外,重点可能是:如果您想为两个不同的类进行常见的事情,那么您的基类就需要这样,

public abstract class Layer {
   private String path; 
   public String getPath() { return path; }
   public void setPath(String newPath) { path = newPath; }

,然后您的子类仅继承该行为。

然后,您只需将扩展了 base 类型的对象添加到集合中即可。

List<Layer> layers = new ArrayList<>();
Layer layer = new VideoLayer();
layers.add(layer);

答案 1 :(得分:0)

因此,借助@GhostCat的帮助和指针,我来到了以下工作代码:

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() );

        // Aggregate with .forEach(), but will switch to .stream() to also be able to filter
        settings.layers.forEach( layer -> {
            System.out.println( layer.path );
            // do stuff
        });
    }
}

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 LayerImage(true, "input/01/", new int[] {255,255,255} ) );
        layers.add( new LayerImage(false, "input/02/", new int[] {255,0,0} ) );
        layers.add( new LayerVideo(true, "input/03/", new int[] {0,0,255} ) );
    }

}

Layer.java

public abstract class Layer {

    boolean run;
    String path;
    int[] color;


    public Layer(boolean startRun, String startPath, int[] startColor) {
        run = startRun;
        path = startPath;
        color = startColor;
    }

}

LayerImage.java

public class LayerImage extends Layer {

    public LayerImage( boolean startRun, String startPath, int[] startColor) {
        super( startRun,  startPath,  startColor) ;
    }

}

LayerVideo.java

public class LayerVideo extends Layer {

    public LayerVideo( boolean startRun, String startPath, int[] startColor) {
        super( startRun,  startPath,  startColor) ;
    }

}

在main.java中,稍后我将交换器.forEach()与.stream()交换。声音更灵活,能够提前过滤结果似乎是一个很大的优势。 (然后,我也可以使用item.run来查看是否要运行此层)。

为什么会有一个设置类?我希望能够在一个文件中为结果设置所有设置和变量。这样,我可以(我认为)快速使用不同的设置文件。也许以后也将其更改为XML输入。使用GUI或其他任何方法。 (您可能会想“啊,夏天的孩子”,到达那儿后我会过桥)。

完成后,Layer SuperClass将在构造函数中包含约10个参数/参数。通过给super()传递子类,给子类带来很多改变和维护;然后进行更改。我将拥有20个子类。有没有更有效的方法?

在上面的代码中我可以做得更好的任何其他指针吗?

所有很多今天已经学会了!谢谢大家,特别感谢@GhostCat

答案 2 :(得分:-1)

我亲自为每个类从对象创建一个静态ArrayList,并将对象添加到构造函数中(使用list.add(this))。

赞:

public class Layer{
 static ArrayList<Layer> layerList = new ArrayList<>();
  public Layer() {
    layerList.add(this);
  }
}