java - android广泛使用的契约设计模式

标签 java android design-patterns

我注意到 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/

相关文章:

java - 无法初始化代理 - 无 session 异常

javascript - 创建供网站和移动设备使用的 API

C# 克隆图和更新循环引用

C++ "triangle"(而不是菱形)继承

java - “找不到符号”或“无法解析符号”错误是什么意思?

java - IDE 将 Listener 标记为红色并表示它不是抽象的

java - Twitter Digits 检查是否已经进行了身份验证

java - 无法在 AsyncTask 中获取经纬度

android - 我如何在 HTML5 中创建类似 Android 的登录模式?

java - 这种情况下如何处理ConcurrentModificationException