【发布时间】:2016-06-24 00:31:45
【问题描述】:
使用旧的 Firebase (com.firebase:firebase-client-android:2.5.2),我们可以这样做:
@JsonAutoDetect(
fieldVisibility = JsonAutoDetect.Visibility.ANY,
isGetterVisibility = JsonAutoDetect.Visibility.NONE,
getterVisibility = JsonAutoDetect.Visibility.NONE,
setterVisibility = JsonAutoDetect.Visibility.NONE)
public class BaseForEveryDataClass {
//some library staff
}
这使我们能够做到这些技巧:
public class Identity extends BaseForEveryDataClass {
private String id;
public String getId(){
return id;
};
//(1) protect id from change, get it internally from firebase
}
public class Movie extends Identity {
//(2) Firebase was detecting the id field for all ancestors of identity
private String imdbId;
public Movie(JSONObject json/*ApiResponse*/) {
imdbId = json.getString("imdb"); //no setter, cannot change it outside
}
//(3) no getter for imdbId - it useless by itself, but have to be stored in a db
//(4) I don't need field "imdbLink" stored in a db, it's calculated
public String getImdbLink() {
return Constants.IMDB_PREFIX+imdbId;
}
}
public class User extends Identity {
//(2) no id field again in a Google-Firebase
//(3) another completely hidden field
private long remindToRateUs = 0;
public boolean shouldShowRateDialog() {
return remindToRateUs < System.currentTimeInMillis();
}
public void remindLater() {
remindToRateUs = System.currentTimeInMillis() + Constants.MONTH;
}
}
所以这些在 Firebase 2.5 中有效,但我找不到在 Firebase 9 中轻松安全的方法(Google 增强版,com.google.firebase:firebase-database:9.0.2)
那么,问题:
(1+2) 是否可以像我们在旧的模拟 Firebase 中一样,在所有基类和持久类中保留所有私有字段? 我知道我们可以用
解决这个问题//inside all ancestors
public int getId() {
super.getId();
}
但它非常不防错,只是不需要额外的工作;
(3) Google 升级后如何让隐藏的内部字段保持不变? 解决方法是为它们添加外部可见的 getter 和/或 setter。但这会使您的数据类容易受到外部黑客攻击,违反封装。
(4)如何在没有 JsonAutoDetect 的情况下一次禁用 ALL “utility-getters”(没有备份真实数据字段的 getters,运行时计算)的持久性? 我知道我们可以为每个人添加@Exclude。他们每个人,卡尔!
@Google,为什么??? O_o 一切正常!
【问题讨论】:
标签: java android firebase firebase-realtime-database