【问题标题】:More efficient ways to initialize objects in java?在java中初始化对象的更有效方法?
【发布时间】:2018-03-18 20:57:31
【问题描述】:

我这里有 10 个对象,但我必须再启动 20 个,有没有更短的方法可以做到这一点?

            Gallina[] gallina=new Gallina[10];
        gato[0]=new Gato(true, "Siames", "Fluffy", 10);
        gato[1]=new Gato(false, "Persa", "Fluffy", 11);
        gato[2]=new Gato(true, "Maine Coon", "Fluffy", 9);
        gato[3]=new Gato(false, "Ragdoll", "Fluffy", 4);
        gato[4]=new Gato(false, "Bengala", "Fluffy", 1);
        gato[5]=new Gato(true, "Sphynx", "Fluffy", 6);
        gato[6]=new Gato(true, "Abisinio", "Fluffy", 3);
        gato[7]=new Gato(false, "Azulruso", "Fluffy", 9);
        gato[8]=new Gato(true, "Siberiano", "Fluffy", 2);
        gato[9]=new Gato(true, "Siames", "Fluffy", 4);

【问题讨论】:

  • 对不起,我忘了说构造函数。 public Gato(boolean garras, String raza, String nombre, int edad) { this.Garras = garras; this.Raza = 拉扎; this.nombre = nombre; this.edad = edad; }
  • 我建议在可以以任何方式参数化的情况下使用循环。此外,如果您想添加一些代码来提问 - 不要评论 - 编辑它。
  • 似乎您正在将数据库硬编码到您的应用程序中。为什么不将定义存储在文件或实际数据库中?
  • 正如@BoristheSpider 所说,从您的代码中获取这些数据。 :) 然后流式传输。如果您需要帮助,请告诉我们。
  • 您制作了一组鸡,但您填充了一组猫。我假设数组的类型及其元素在您的程序中实际匹配。

标签: java object constructor


【解决方案1】:

你可以避免所有的作业,但恐怕不会更短:

Gato[] gato = new Gato[] {
    new Gato(true, "Siames", "Fluffy", 10),
    new Gato(false, "Persa", "Fluffy", 11),
    ...
};

与您的技术相比,这有两个轻微的优势:

  • 您不能通过混合索引来跳过和/或覆盖项目,并且
  • Java 编译器会根据您放入数组的项目数来调整数组大小。

显然,这假设数组在初始化期间已完全填充。

【讨论】:

    【解决方案2】:
    class Gallina {
        private int gatoIndex = 0;
    
        private Gato[] gatos;
    
        public Gallina(int gatosLength) {
            gatos = new Gato[gatosLength];
        }
    
        public void addGato(boolean state, String name, String type, int value) {
            if (gatoIndex > gatos.length) {
                // an exception probably or resize array
            }
            gatos[gatoIndex] = new Gato(state, name, type, value);
            gatoIndex += 1;
        }
    }
    
    class Test {
        public static void main(String[] args) {
            Gallina gallina = new Gallina(10);
    
            gallina.addGato(true, "ABC", "Fluffy", 10);
        }
    }
    

    使用List<Gato> 代替Gato[] 将帮助您摆脱gatoIndex 并自行调整数组大小。

    基本上有了上述内容,您就不需要每次都编写相同的new Gato() 样板。

    【讨论】:

      【解决方案3】:

      考虑使用静态工厂方法而不是构造函数。

      它给你一些好处:

      • 静态工厂方法有名字
      • 静态工厂方法不需要在每次调用时都创建一个新对象
      • 静态工厂方法可以返回其返回的任何子类型的对象 输入

      实施

      class Gato {
          private boolean field1;
          private String field2;
          private String field3;
          private int field4;
      
      
      private Gato (boolean field1, String field2, String field3, int field4) {
          this.field1 = field1;
          this.field2 = field2;
          this.field3 = field3;
          this.field4 = field4;
      }
      
      public static Gato newInstance (boolean field1, String field2, String field3, int field4) {
          return new Gato(field1, field2, field3, field4);
      }
      

      所以在你的方法中你将使用那个实现

      gato[0] = Gato.newInstance(true, "Siames", "Fluffy", 10);
      

      【讨论】:

      • 虽然如果严格的目标是“shorter”(更少的代码),那么这完全相反......
      猜你喜欢
      • 2022-08-18
      • 2011-05-17
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多