繁体   English   中英

同一类中的两个构造函数具有不同的参数

[英]Two constructors at in the same class with different parameters

在第1课中,我创建了一个实例:

  db = new AdapterDB (cal, rcarbohydrate, rfat, rprotein, getApplicationContext());

在第2课中,我进行了一个实例:

db = new AdapterDB (Bits, Truncation, Crossover, Mutation, Chromosomes, Generation, getApplicationContext());

在AdapterDB类中,我构造了构造函数:

private DatabaseHelper DBHelper;
    private SQLiteDatabase db;

    public AdapterDB(Context ctx)
    {
        this.context = ctx;
        DBHelper = new DatabaseHelper (context);
    }

    double Truncation;
    double Crossover;
    double Mutation;
    int Generation;

    private Context context;

    int indexOfChromosomes ;
    int indexOfGens;
    int gensNumber;
    int chromosomesNumber;

    String [][] population;
    double [] fitnesstotal;

    public AdapterDB(int Bits, double Truncation, double Crossover, double Mutation, int Chromosomes, int Generation, Context ctx)
    {
        this.indexOfGens = Bits;
        this.Truncation = Truncation;
        this.Crossover = Crossover;
        this.Mutation = Mutation;
        this.indexOfChromosomes = Chromosomes;
        this.Generation = Generation;
        this.context = ctx;
        DBHelper = new DatabaseHelper (context);

        population = new String[indexOfChromosomes][indexOfGens];
        fitnesstotal = new double [indexOfChromosomes];
    }

double cal;
    double rcarbohydrate;
    double rfat;
    double rprotein;

    public AdapterDB(double cal, double rcarbohydrate, double rfat, double rprotein, Context ctx)
    {
        this.cal = cal;
        this.rcarbohydrate = rcarbohydrate;
        this.rfat = rfat;
        this.rprotein = rprotein;
        this.context = ctx;
        DBHelper = new DatabaseHelper (context);
    }

在构造函数中该值仍然存在,每个变量上都有一个值,但是当我想在AdapterDB类的某些函数中使用它时,cal,rcarbohydrate,rfat和rprotein为零(0.0),为什么会发生这种情况? 以及如何解决? 谢谢。

任何新手程序员都应记住的一个好的经验法则是,从一开始就拥有将带来好处:

什么是一类? (来自Java教程)

您的AdapterDB类显然试图同时成为两个不同的事物。 我猜想您的调用使用第一个构造函数创建了一个实例,但是随后期望填充其他值(由第二个构造函数设置)。

您可能应该做的是使AdapterDB成为抽象类:

public abstract class AdapterDB {

    private Context context;
    private DBHelper dbHelper;

    public AdapterDB(Context context) {
        this.context = context;
        this.dbHelper = new DBHelper(context);
    }

    public Context getContext() {
        return context;
    }

    public DBHelper getDBHelper() {
        return dbHelper;
    }
}

然后,您可以为需要表示的各种数据类型创建单独的类:

public class GeneticAdapter extends AdapterDB {

    int chromosomesNumber;
    // ... And others

    public GeneticAdapter(Context context, int numChromosomes, ...) {
        super(context);
        // Set your instance variables
    }
}

一个适合健身吗?

public class FitnessAdapter extends AdapterDB {
    double cal;
    // ... And others

    public FitnessAdapter(Context context, double cal, ...) {
        super(context);
        // Set your instance variables
    }
}

我很抱歉,如果这不是您想要的,您的问题有点难以理解。 祝您好运,如果您有后续行动,请在下方评论(或编辑答案)。

听起来您正在创建两个单独的实例,并尝试通过给它们指定相同的名称来合并它们。 这不是Java的工作方式。

第1类使用给定的参数制作一个adapterdb(称为db)。

类2使用给定的参数制作另一个adapterdb。

如果DB是两个类都可以访问的某种全局变量,则引用DB指向NEW对象,而第一个对象是垃圾。 对构造函数的第二次调用不会将两者合并在一起。

构造函数似乎属于两个不同的类:通常,构造函数会将所有实例变量设置为至少某个默认值。

如果您确实想“合并”这两个,我将使用默认构造函数并将您拥有的两个构造转换为大型setter方法,如下所示:

public AdapterDB(Context context) {
    this.context = context;
    this.dbHelper = new DBHelper(context);
}

public setFitness(double cal, double rcarbohydrate, double rfat, double rprotein, Context ctx) {
    ...
}

public setGenetics(int Bits, double Truncation, double Crossover, double Mutation, int Chromosomes, int Generation, Context ctx) {
    ....
}

但是,由于参数是如此不同,因此我将对按原样构造类保持警惕,并且我将看看craig提出的解决方案是否不是更合适的选择。

您可以使用this关键字调用另一个构造函数。

class Animal {
    int weight;
    String name;

    Animal(int w) {
        weight = w;
    }

    Animal(String n) {
        this(10);  // set the weight to 10
        name = n;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM