【问题标题】:C# Property Syntax in JavaJava 中的 C# 属性语法
【发布时间】:2010-06-30 09:18:22
【问题描述】:

我已经阅读了有关 Java 没有也不太可能获得 C# 样式属性的问题/答案。但是,在这个问题中:How to organize database access code in Android project?,有一些示例代码的答案是这样的:

c = localDBRW.rawQuery(sql, selectionArgs);

在对该答案的 cmets 中,他说 localDBRW 被“定义为对 getWritableDatabase() 的引用”。对我来说,这意味着在上面的行中调用了 getWritableDatabase(),并在 getWritableDatabase() 的结果上调用了 rawQuery。

所以我的问题是:这是怎么做到的?

在 C# 中这将是微不足道的。我是 Java 新手,所以我什至不确定会导致我得到答案的术语是什么。对“属性”、“方法”和“引用”的搜索并未导致这种特殊用法。

答案总结:

我抓住了一个梦想。我以一种意味着我的愿望可以实现的方式来解释最初的陈述。唉,这不是事情的方式。 Java 对 C# 属性语法没有任何希望,我被驱逐到永远写 obj.getX() 而不是 obj.X。

【问题讨论】:

  • “我被驱逐到永远写 obj.getX() 而不是 obj.X” - 没关系,儿子,你会克服的。跨度>

标签: java


【解决方案1】:

localDBRW 被“定义为对getWritableDatabase() 的引用”

我相信这只是意味着在使用之前有这个声明,仅此而已:

localDBRW = getWritableDatabase();

Java 目前没有类似属性的语义。您不能使用字段访问语法来调用方法。最接近这种情况的是第一次访问一个字段并触发其初始化代码,但这是一个完全不同的结构。

相关问题

【讨论】:

  • 您好。有问题的代码是我写的。你是对的 - localDBRW 之前定义过:SQLiteDatabase localDBRW;。然后将其设置为getWritableDatabase() 的值。在Android中getWritableDatabase()getReadableDatabase()只返回当前读/写的数据库对象,如果它没有定义,他们会先打开它并确保它已经定义。
【解决方案2】:

localDBRW 是一个 getWritableDatabase()。它被定义为对 getWritableDatabase() 的引用。我建议在需要时调用 getWritableDatabase() 而不是 localDBRW。

不要从字面上理解。 localDBRW 是一个属性,并使用 getWritableDatabase() 调用的结果初始化(在某处)。所以它是一个可写的数据库。在 Java 中,属性永远不能持有对方法的引用(函数指针)。

【讨论】:

    【解决方案3】:

    根据您的说明进行了编辑。我保留了旧答案,以防它对某人有用。

    Java 具有反射 API,允许您查找和调用对象的任意命名方法。所以你不会有一个

     theMethod.invoke()
    

    打电话,而是

     // assuming you have a Class clazz and Object clazzObj
     Method theMethod= clazz .getMethod(
              "someName", null /* or a list of desired params*/);
    
     theMethod.invoke(clazzObj, arglist);
    

    我认为有了这个(也许用一个合适的类来包装 { clazzObj, theMethod } 对,你可以非常接近你需要的行为,我猜这是某种数据驱动的调度。

    === 旧答案 ====

    据我所知,您正在尝试使用一些参数执行一些 SQL,然后使用结果的行和列。

    所以这可以通过 JDBC 准备语句调用来完成,并对结果集进行一些迭代。结果集允许您按编号访问列。

    我在这里看不到 Java 和 C# 方法之间的任何区别。你引用的例子有

    c.moveToFirst();
    recordID = c.getString(c.getColumnIndex("id"));
    c.close();
    

    一个 JDBC tutorial 显示这样的代码

    String query = "
    SELECT COFFEES.COF_NAME " +
       "FROM COFFEES, SUPPLIERS " +
       "WHERE SUPPLIERS.SUP_NAME LIKE 'Acme, Inc.' " +
       "and SUPPLIERS.SUP_ID = COFFEES.SUP_ID";
    
    ResultSet rs = stmt.executeQuery(query);
    System.out.println("Coffees bought from Acme, Inc.: ");
    while (rs.next()) {
        String coffeeName = rs.getString("COF_NAME");
        System.out.println("     " + coffeeName);
    }
    

    您在哪里按名称获取坐标。

    【讨论】:

    • sql/database 与问题并不真正相关。我在询问不使用()的方法的运行。不过谢谢!
    猜你喜欢
    • 2011-10-25
    • 2012-12-17
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    相关资源
    最近更新 更多