【问题标题】:How can I remove "m" prefix from greenDAO's generated getters and setters?如何从 greenDAO 生成的 getter 和 setter 中删除“m”前缀?
【发布时间】:2017-05-27 13:02:54
【问题描述】:

GreenDAO 正在其生成的类中搜索名称中包含“m”前缀的 getter 和 setter。

例如,我已将实体设置为不生成任何 getter 和 setter,但它仍然会为我的 private Date mDate 寻找 getMDate(),而不是手动创建的 getDate() 方法。二传手也是如此。

这只是打破了我对Android Code Style Guidelines 的坚持。

有没有办法配置 greenDAO 以使用我在 Android Studio 生成代码时设置的代码样式标准?


编辑:为了让事情更清楚,我添加了一些代码来表达我的观点。我写了上面的问题,因为我在努力工作时患有慢性花粉热,只是想睡觉,所以我对抗组胺药有一半的影响,所以如果它还不足以解决问题,我深表歉意。

@Entity(generateConstructors = false, generateGettersSetters = false)
public class Day {

    @Id
    private long mId;

    @Unique
    @NotNull
    private Date mDate;

    @ToMany(referencedJoinProperty = "mDayId")
    private List<Goal> mGoals;

    public Day(long id) {
        this.mId = id;

        mGoals = new ArrayList<Goal>();
    }

    public Day(long id, Date date) {
        this.mId = id;
        this.mDate = date;
    }

    public long getId() {
        return mId;
    }

    public void setId(long id) {
        mId = id;
    }

    public Date getDate() {
        return mDate;
    }

    public void setDate(Date date) {
        mDate = date;
    }

    public List<Goal> getGoals() {
        return mGoals;
    }

    public void setGoals(List<Goal> goals) {
        mGoals = goals;
    }
}

上面是我的Day 类。如您所见,我在@Entity 注释中禁用了getter 和setter 的生成,并将我自己的放入其中。当我使用 alt+enter 为我的每个字段创建 getter 和 setter 时,我已设置 Android Studio 以考虑“m”。

public Date getMDate() {
    return mDate;
}

public void setMDate(Date mDate) {
    this.mDate = mDate;
}

这是 greenDAO 在给定字段private Date mDate 的情况下为我的代码生成的getter 和setter 示例。这违反了代码样式准则,因为局部变量包含“m”前缀,并且方法名称也包含它(可能有点挑剔,但您可以设置 Android Studio,使其不不要做让我觉得不应该那样的事情)。

有了我的 getter 和 setter,greenDAO 仍然认为 getter 和 setter 丢失了,这导致它们被添加了两次。一次是我放入的,另一个是您在上面看到的。这也会导致生成下面的代码。

@Override
protected final void bindValues(DatabaseStatement stmt, Day entity) {
    stmt.clearBindings();
    stmt.bindLong(1, entity.getMId());
    stmt.bindLong(2, entity.getMDate().getTime());
}

@Override
protected final void bindValues(SQLiteStatement stmt, Day entity) {
    stmt.clearBindings();
    stmt.bindLong(1, entity.getMId());
    stmt.bindLong(2, entity.getMDate().getTime());
}

这里是来自greenDAO 生成的DayDao 类的一些代码。如果我没有在 Day 实体类上禁用它们的生成,它仍然使用它本来可以用来生成自己的 getter 和 setter 的名称(getMDate() 而不是 getDate()) .我无法更改此代码,因为它只是在我下次构建项目时切换回来,这是我的问题。

我的问题是:如何让 greenDAO 在生成代码时考虑“m”前缀并让它使用我自己设置的 getter 和 setter?或者甚至让它在名称和局部变量中不包含“m”的情况下自行生成 getter 和 setter?

【问题讨论】:

  • 对非静态和非公共字段使用m 前缀是标准的。
  • @Gala 是的,这就是我正在做的事情。我看不到你的意思
  • 我们所有人都无法理解您的问题。您要归档什么?
  • @Gala 我很快就会用代码更新我的问题
  • @Gala 抱歉,如果我之前遇到困难。希望添加的代码和对它的解释有助于理解我的观点。

标签: android greendao


【解决方案1】:

我决定为此使用的解决方案结果相当令人失望。

它只涉及将我的属性全部设为public 而不是private。仍然符合代码风格,这些属性将不再使用 m 前缀 ... 或任何前缀,就此而言。这不是一个非常令人满意的解决方案,因为现在可以直接访问和设置我的数据,只是为了符合一个简单的命名约定。

我(个人)不同意人们说使用命名约定会损害可读性的说法。如果您的代码结构足够好,并且在 Javadoc cmets 等中给出了足够的描述,您就会确切地知道某事在做什么。话虽如此,如果使用约定会像我上面的问题那样创建这样的代码,那么我想这是它确实存在的情况,并且是在我的其他项目中不使用代码样式并仍然坚持的原因访问我想要的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    相关资源
    最近更新 更多