如何在构造函数中对常见的初始化进行分组?

时间:2017-10-03 07:55:53

标签: java android constructor

我用Java编写Android应用程序。我的类有两个构造函数 - 一个在直接传递数据时使用,第二个if类应该从bundle反序列化数据。一切看起来更像是:

public class MyClass {

    private final ObservableInt myField;
    private final int data;

    public MyClass(int data) {

        myField = new ObservableInt();
        myField.addOnChangedListener(myListener);

        this.data = data;
    }

    public MyClass(Bundle bundle) {

        myField = new ObservableInt();
        myField.addOnChangedListener(myListener);

        this.data = bundle.getInt("SomeName");
    }
}

考虑上面一个简单的例子。我有更多的最终字段要填写,还有更多data - 类型的字段。

现在请注意,在每个构造函数中重复此代码:

        myField = new ObservableInt();
        myField.addOnChangedListener(myListener);

我想将它重构到一个地方以避免干旱问题。我尝试创建私有构造函数并在上面的每个构造函数中调用this(),但编译器抱怨说," data"字段可能尚未初始化,我不想通过参数将其传递给该私有构造函数,因为在我的情况下,有很多data要填充。

3 个答案:

答案 0 :(得分:1)

您可以尝试使用这样的初始化程序:

<script type="text/javascript"> 

google.charts.load('current', {'packages':['corechart']}); 
google.charts.setOnLoadCallback(drawChart); 

function drawChart() { 
  var jsonData = $.ajax({ 
      url: "<?php echo base_url() . 'index.php/main/lihat_graph' ?>", 
      dataType: "json", 
      async: false 
      }).responseText; 

  var data = new google.visualization.DataTable(jsonData);

  var options = {
    title:    '',
    hAxis:    {title: 'Jumlah Kepakaran'},
    vAxis:    {title: 'Jumlah Kepakaran'},
    bubble:   {textStyle: { fontName: 'arial', fontSize: 12 }},
    colors:   ['beige','pink','#00ADF9', 'maroon', 'red', 'green', 'purple', 'gray', 'orange']
  };

  if(data.getNumberOfRows() == 0){
    $("#chart_div").append("Graf Bidang Kepakaran masih dalam proses 
    pengumpulan data. Graf akan dipaparkan setelah proses pengumpulan data 
    selesai.")
  }else{
   var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
   chart.draw(data, options);        
  }
} 


$(window).resize(function(){
  drawChart();
});
</script> 

答案 1 :(得分:-1)

  

尝试创建私有构造函数并调用this()

你可能不总是可以选择DRY,但在你的情况下我会链接构造函数:

$limit = 'some_large_number'

答案 2 :(得分:-1)

使用&#34; int&#34;构造函数默认为:

public class MyClass {

  private final ObservableInt myField;
  private final int data;

  public MyClass(int data) {
    myField = new ObservableInt();
    myField.addOnChangedListener(myListener);
    this.data = data;
  }

  public MyClass(Bundle bundle) {
    this(bundle.getInt("SomeName"));
  }
}