我注意到 Android 默认应用程序的开发人员使用契约模式。它经常被用来数据库、内容提供商。合约类是最终的并存储常量,对我来说奇怪的是内部接口(interface)。
public final class ClockContract
protected interface AlarmsColumns extends AlarmSettingColumns, BaseColumns
protected interface InstancesColumns extends AlarmSettingColumns, BaseColumns
protected interface CitiesColumns
所有这些类(和接口(interface))都是常量的容器。这样做是个好方法吗?为什么不在每个类中定义它们呢?
在接口(interface)中存储变量是一种好的做法吗?
对我来说最奇怪的事情是对内部接口(interface)的追求。请解释一下这个想法。
谢谢
最佳答案
契约(Contract)基本上是用于一组指定目的的定义列表。这是一个很好的实践,因为人们不太可能滥用不相关领域中的所有类和接口(interface)。
public final class DatabaseContract {
/***Inner class that defines the table contents.***/
public static abstract class Entry implements BaseColumns {
public static final String
TABLE_NAME = "Alarms",
COLUMN_NAME_ENTRY_DAY = "day",
COLUMN_NAME_ENTRY_HOUR = "hour",
COLUMN_NAME_ENTRY_MINUTE = "minute",
COLUMN_NAME_ENTRY_STATUS = "status",
COLUMN_NAME_ENTRY_ALARM_TEXT = "alarmtext";
}
private DatabaseContract(){}
public static void init(Context context){
new DatabaseHelper(context);
}
public static Cursor selectAll(Context context){
String sql = "SELECT * FROM " + TABLE_NAME;
return new DatabaseHelper(context).getReadableDatabase().rawQuery(sql,null);
}
public static void insert(Context context, ContentValues values){
new DatabaseHelper(context).getWritableDatabase().insert(TABLE_NAME, null, values);
}
public static void update(Context context, int id, ContentValues values){
new DatabaseHelper(context).getWritableDatabase().update(TABLE_NAME, values, Entry._ID + " = " + id, null);
}
public static void remove(Context context, int id){
new DatabaseHelper(context).getWritableDatabase().delete(TABLE_NAME, Entry._ID + " = " + id, null);
}}
上面的代码是合约模式的一个例子。很明显,除了访问数据库之外,您不会在其他任何地方使用内部类 Entry 。这就像您创建一个枚举来支持您的类,您可能希望限制类函数的输入参数。
如果你不需要处理对变量的多重访问,你可以将变量存储在合约中。然而,它不应该这样做,因为合约意味着存储定义和协议(protocol)。这些东西不应该在运行时改变。
关于java - android广泛使用的契约设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27021599/