如何从 greenDAO 生成的 getter 和 setter 中删除 "m" 前缀?
How can I remove "m" prefix from greenDAO's generated getters and setters?
GreenDAO 正在搜索其生成的 classes 中名称中包含 "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
class。如您所见,我在 @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());
}
这里是一些来自 class DayDao
的代码,它是从 greenDAO 生成的。它仍然使用 getters(还有 setters)的名称,如果我没有在 Day
实体class。我无法更改此代码,因为它会在我下次构建项目时切换回来,这就是我的问题。
我的问题是:如何让 greenDAO 在生成代码时考虑 "m" 前缀,并让它使用我自己设置的 getter 和 setter?或者甚至在名称和局部变量中不包含 "m" 的情况下让它自己生成 getter 和 setter?
我决定为此使用的解决方案最终相当令人失望。
它只涉及让我的属性全部 public
而不是 private
。仍然符合代码风格,这些属性将不再使用 m
前缀......或任何前缀,就此而言。这不是一个非常令人满意的解决方案,因为现在我的数据可以直接访问和设置,只是为了符合一个简单的命名约定。
我(个人)不同意人们所说的使用命名约定会损害可读性。如果您足够好地构建您的代码并在 Javadoc 注释等中提供足够的描述,您将确切地知道正在做什么。话虽如此,如果使用约定将创建如我上面问题中的代码,那么我想这就是它的情况,并且是不在我的其他项目中使用代码风格并仍然坚持的原因访问我想要的数据。
GreenDAO 正在搜索其生成的 classes 中名称中包含 "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
class。如您所见,我在 @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());
}
这里是一些来自 class DayDao
的代码,它是从 greenDAO 生成的。它仍然使用 getters(还有 setters)的名称,如果我没有在 Day
实体class。我无法更改此代码,因为它会在我下次构建项目时切换回来,这就是我的问题。
我的问题是:如何让 greenDAO 在生成代码时考虑 "m" 前缀,并让它使用我自己设置的 getter 和 setter?或者甚至在名称和局部变量中不包含 "m" 的情况下让它自己生成 getter 和 setter?
我决定为此使用的解决方案最终相当令人失望。
它只涉及让我的属性全部 public
而不是 private
。仍然符合代码风格,这些属性将不再使用 m
前缀......或任何前缀,就此而言。这不是一个非常令人满意的解决方案,因为现在我的数据可以直接访问和设置,只是为了符合一个简单的命名约定。
我(个人)不同意人们所说的使用命名约定会损害可读性。如果您足够好地构建您的代码并在 Javadoc 注释等中提供足够的描述,您将确切地知道正在做什么。话虽如此,如果使用约定将创建如我上面问题中的代码,那么我想这就是它的情况,并且是不在我的其他项目中使用代码风格并仍然坚持的原因访问我想要的数据。