【问题标题】:Java - Passing values to a constructor without entering the values one by oneJava - 将值传递给构造函数而不一一输入值
【发布时间】:2021-10-05 09:56:39
【问题描述】:

我需要创建一个 TReadings 列表,其中将填充我将从 Excel 文件中一一提取的值。

有问题的班级:

public class TReadings {
long zone1;
long zone2;
.
.
.
long zone99;

// constructor
public TReadings (long zone1, long zone2 ... long zone99){
this.zone1=zone1;
.
.
.
}
}

由于这个构造函数有 99 个参数,有没有什么方法可以将值(或列表)传递给构造函数,而无需逐一输入所有值?

【问题讨论】:

  • 数组、向量、列表……任何类型的集合。每当您发现自己在写 thing1, thing2 等时,请始终首先考虑这些。
  • 可变参数?你似乎暗示过他们;)
  • 你可以试试反射
  • 不管你如何传递值,一个类中有 99 个字段是一种代码味道。
  • 似乎可以在这里使用 HashMap。不需要构造函数/类。

标签: java list class constructor


【解决方案1】:

如果TReadings在你的控制范围内,即你可以改变它,你可以像这样定义一个构造函数:

public class TReadings {
   List<Long> zoneList;

   TReadings(List<Long> zoneList){
      this.zoneList = zoneList;
   }
}

【讨论】:

  • 小心。当有人像这样将列表传递给构造函数时,不会复制列表,但会存储其引用。对原始列表的更改会导致 TReadings 也发生更改!
  • 对,调用构造函数的函数应该在每次调用它之前(更准确地说是在读取新值之前)创建新列表
  • 好吧,它可能是基于意见的,但我认为构造函数应该确保其实例的状态不受外部修改,而不是调用方法。
【解决方案2】:

您可以使用可变参数。

public class TReadings {
    List<Long> zoneList = new ArrayList<Long>();
    
    public TReadings(Long... values) {
        for (Long val : values)
            zoneList.add(val);
    }
}

然后你可以通过使用参数数量来调用它:

new TReadings(1L, 23L);
new TReadings(1L, 22L, 44L, 87L, 5L);
new TReadings(99L);

【讨论】:

    【解决方案3】:
    public class TReadings {
        
        List<Long> zones;
    
        public TReadings(List<Long> zones) {
            this.zones = zones;
        }      
    }
    
    //and to call it
    List<Long> zones = new ArrayList<>();
    zones.add(1);
    //...
    zones.add(99);
    TReadings readings = new TReadings(zones);
    

    【讨论】:

      猜你喜欢
      • 2018-05-09
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 2022-08-14
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多