链接多个构造函数

时间:2017-11-19 20:31:27

标签: java constructor initialization

据我所知,当链接构造函数时,必须在主构造函数的第一行完成,有人可以解释如何使用下面的代码。 我想链接到所有构造函数,以便除了主构造函数之外它们都可以是私有的。

public class Flight {

    int passengers = 0;
    int seats  = 150;
    double maxKgPerPassenger;

    private Flight(int passengers) {
        this.passengers = passengers;
    }

    private Flight(int seats) {
        this.seats = seats;
    }

    private Flight(double maxKgPerPassenger) {
        this.maxKgPerPassenger = maxKgPerPassenger;
    }

    public Flight(int passengers, int seats, double maxKgPerPassenger) {
        this(passengers); 
        this(seats);
        this(maxKgPerPassenger);    
    }

}

3 个答案:

答案 0 :(得分:3)

构造函数最多可以设置尽可能多的字段或完全构造实例。

您选择一个具有更多参数的构造函数,并在具有较小数量的构造函数中使用它。例如,

public Flight(double maxKgPerPassenger) {
    this(0, 0, maxKgPerPassenger); // default, default, maxKgPerPassenger
}

private Flight(int passengers, int seats, double maxKgPerPassenger) {
    this.passengers = passengers; 
    this.seats = seats;
    this.maxKgPerPassenger = maxKgPerPassenger;
}
  

我想链接到所有构造函数,以便除了主构造函数之外它们都可以是私有的。

我建议采取相反的方式。使所有构造函数都使用public,但是如果你不使用它,则使用全参数构造函数private

您尝试采用的方法类似于the builder pattern,其中每个方法都设置一个字段。如果一些论点要长大,你肯定需要看看它。

答案 1 :(得分:2)

为什么要链接构造函数?
在链接构造函数时,必须从构造函数中指定一些默认值,并使用带有更多参数的调用构造函数的参数较少。
你在这里做反过来:

 // this array must be declared as global field
 public string[] files;
 private void Button_OpenFile_Click(object sender, EventArgs e)
 {
     FolderBrowserDialog OpenFBD = new FolderBrowserDialog();
     if (OpenFBD.ShowDialog() == DialogResult.OK)
     {
         LBX_Files.Items.Clear();

         files = System.IO.Directory.GetFiles(OpenFBD.SelectedPath);
         foreach (string file in files)
         {
             LBX_Files.Items.Add(System.IO.Path.GetFileName(file));
         }
     }
 }

 private void LBX_Files_SelectedIndexChanged(object sender, EventArgs e)
 {

         L_ShowContents.Text = File.ReadAllText( files.FirstOrDefault(x => x.Contains(LBX_Files.SelectedItem.ToString())));
 }

您确实希望从构造函数中调用所有其他构造函数的参数最多 它没有任何意义,它也无效,因为构造函数可以调用同一个类的其他构造函数。

  

我想链接到所有构造函数,以便它们都可以是私有的   除主要构造函数外。

事情的工作顺序相反。

实际代码似乎不需要构造函数链接 这个就足够了:

public Flight(int passengers, int seats, double maxKgPerPassenger){    
    this(passengers); 
    this(seats);
    this(maxKgPerPassenger);    
}

假设类客户端可以创建具有两种风格的public Flight(int passengers, int seats, double maxKgPerPassenger){ this.passengers = passengers; this.seats = seats; this.maxKgPerPassenger = maxKgPerPassenger; } 实例:

  • 传递所有参数
  • 仅传递Flight参数(仍然使用默认值进行评估)

你可以写:

seats

答案 2 :(得分:0)

使默认构造函数为private,以防止构造函数实例化并使用公共静态方法实例化对象。这样您就可以解决构造函数限制。为了增加一点混淆,我通过添加 void 返回类型,使用类名将构造函数转换为普通方法。还要考虑是否真的想要不是Builder模式。

`class foo extends Component {
     constructor(props) {
         super(props);
         this.state = {
             isDisabled: true,
             textOpacity: 0.1,
             text1: '',
             text2: '',
         };

      onTextChange1(text) {
          if (text.length > 0 && this.state.text2.length > 0) {
              this.setState({isDisabled: false, textOpacity: 1, text1: text});
          }
          else {
              this.setState({isDisabled: true, textOpacity: 0.1, text1: text});
          }
      }

      onTextChange2(text) {
          if (text.length > 0 && this.state.text1.length > 0) {
              this.setState({isDisabled: false, textOpacity: 1, text2: text});
          }
          else {
              this.setState({isDisabled: true, textOpacity: 0.1, text2: text});
          }
      }

      render() {
          return (
              <View>
                  <TextInput onChangeText={(text) => this.onTextChange1(text)} value={this.state.text1}/>
                  <TextInput onChangeText={(text) => this.onTextChange2(text)} value={this.state.text2}/>
                  <TouchableOpacity disabled={this.state.isDisabled}>
                      <Text style={{opacity:this.state.textOpacity}}>Hello World!</Text>
                  </TouchableOpacity>
              </View>
          );
      }
}