多个参数还是有什么方法可以强制使用setter(Java)?

时间:2016-03-23 22:59:32

标签: java android sqlite oop setter

我有一个名为Transactions的java类,有几种方法。特别是,在Sqlite数据库中插入表示新事务的所有值,如下所示:

  

日期;时间;类别;收款人;付款人;值;标签;说明(...)

当我调用方法来保存新的Transaction时,它看起来像:

new Transactions().saveNewTransaction(String date, String time, String category, Int Payee, Int Payer, String value, String tags, String Description (...)

我认为这个方法看起来很大,对可读代码来说很糟糕,最好的方法是将这些字段作为Transactions类中的变量,方法saveNewTransaction()不需要参数,而是访问类中的变量。

唯一的问题是:我如何强制到一个类(在我的情况下是一个Activity类)调用保存新事务所需的所有setter?

风险是调用saveNewTransaction()和几个没有由Activity类设置的值的字段(至少方法确保所有字段必须由调用者设置)

谢谢!

2 个答案:

答案 0 :(得分:0)

如果您的要求是每个创建的Transactions对象都应该导致某些数据库条目,您可以考虑删除saveNewtTransaction方法,而是在某个“构建器”类中执行save-action:

public class TransactionBuilder {
private Date date;

public TransactionsBuilder with(@NonNull Date date){
    this.date = date;
    return this;
}

public Transaction build(){
    validateFields();

    Transaction transaction = new Transaction();
    transaction.set(date);

    createADatabaseEntry(transaction);
    return transaction;
}

private void validateFields() {
    org.springframework.util.Assert.notNull(date, "The date cannot be null.");
}

当开发人员尝试将null传递给使用@NonNull注释的setter时,有checker framework个问题编译器警告。

显然,在你的情况下,构建器会有一些不同的with() - 方法,即一些匹配你的Transactiion对象/ saveNewTransaction()方法所需的方法。

我还没有想到你的交易类是什么。但是如果Transactions类只有那个方法,我会创建一个上述解决方案的变体:

  1. 使用定义功能的单个方法创建接口。
  2. 创建一个包含saveNewTransactions()方法逻辑的实现。唯一不同的是,此方法应该只接受单个参数,即“输入bean”,fx TransactionInputBean。
  3. 创建您的输入bean(一个简单的类,包含私有字段,以及公共getter和amp; setter。
  4. 为输入bean创建构建器。

答案 1 :(得分:0)

你可以保留所有这些变量未初始化或将它们设置为不应该由设置者发生的值(例如-1)。

然后在您的 private void TreeViewName_Checked(object sender, RoutedEventArgs e) { var checkBox = e.OriginalSource as CheckBox; MyClass dataContext = checkBox?.DataContext as MyClass; if (dataContext != null) { // Do something with MyClass instance } } 中,您需要检查他们是否还有该值。

但是这个解决方案不会像你上面写的那样工作,因为你在创建对象时已经保存了事务。在这里,您需要先创建新对象,然后调用所有设置器。

您的交易类可能如下所示:

new Transactions().save();

我希望这个芒果能满足你。