如何在Java中模拟指针类型操作,还是Java Pass-By-Reference或Pass-By-Value?

Rob*_*use 3 java pointers field

我正在将Mysql数据库建模为Java中的练习.个人实验.并且我想将表排序规则存储为字符串,因为列可以具有与表不同的排序规则,我还需要为每个列存储它.如果列的collat​​ion字段只能指向表的collat​​ion字段,那将非常有用.但我知道Java没有指针.

您是否知道如何将一个对象的字段指向另一个对象的字段,以便两者始终匹配?

Edw*_*uck 6

Java有引用,它是指针的好部分,无法进行指针数学运算.

public class Table {

  // name does not store a String, it stores a reference to a String
  private String name;

  // tableName is not passed in by copy, tableName's reference is passed in.
  public Table(String tableName) {
    // this is not a copy assignment, but a reference assignment
    name = tableName;
  }

}
Run Code Online (Sandbox Code Playgroud)

至于始终指向Java中的字段,您必须记住一些事情.对象是面向对象编程语言中的基本元素,而不是名称.因此,您无法构建对对象内部名称的引用,因为如果您通过其基类型或超类型引用Object,则永远不会清楚.由于相同的名称可以存在于超类和子类中(这可以隐藏超类类型),因此如果不了解它们正在解析的实际类实例,则无法正确解析字段名称引用.

这是设计,而不是偶然.事实上,类的成员字段的外部知识正是使代码维护变得如此困难的原因,因为没有"垫片"可以在调用者和数据之间插入代码.通过封装数据(置于方法调用之后),可以为将来的代码维护设置阶段; 因为,可以插入代码以根据可能更改的内部数据元素生成返回值.

一个例子

public class Table {

  public Column[] columns;

  public String name;

  public Table() {
    name = ...;
    columns = ...;
  }

}

public class CreateTableDDL {

  public String statement(Table table) {
    StringBuilder buffer = new StringBuilder();
    buffer.append("CREATE TABLE ");
    buffer.append(table.name);
    buffer.append(" (");
    for (int i = 0; i < table.columns.length; i++) {
      Column column = table.columns[i];
      ...
    }
    ...
    return buffer.toString();
  }

}
Run Code Online (Sandbox Code Playgroud)

暴露columns为一个类型的数组Column,这不一定是坏事,直到我们决定我们希望它是一个List,Column所以我们可以Column在一个新的漂亮的动态添加或删除s TableEditor.

由于我们公开了基础数据元素,现在我们必须搜索整个代码库以找到该字段的任何用途,并重写所有用途,现在使用一个List接口.实际上,我们还需要做更多的工作,因为我们还必须搜索可能columns直接使用该字段的每个外部库,因为我们不知道的多个JAR可能已经使用过这个公共类.

此外,我们很快就会注意到,我们正在做的大多数事情columns都是真正Table的业务,但是位于"帮助者"和辅助类中,这有损于表中最佳本地化的职责.

最后,我们甚至可能会注意到外部类正在修改表的列而没有表的知识; 因为,他们绕过任何可能通过直接获取数据来提醒表更改的代码.

如果我们完成了

public class Table {

  private Column[] columns;

  private String name;

  public Table() {
    name = ...;
    columns = ...;
  }

  public Column[] getColumns() {
    Column[] copy = new Column[columns.length];
    for (int i = 0; i < columns.length; i++) {
      copy[i] = columns[i].clone();
    }
    return copy;
  }

}
Run Code Online (Sandbox Code Playgroud)

然后我们可以轻松地将基本存储转换为a List并且刚刚从列表中构造了我们的"向后兼容"列数组.调用代码现在不需要更改,即使我们确定我们以前存在的columns字段现在需要是a Map of String to DataType.

 public class CreateTableDDL {

  public String statement(Table table) {
    StringBuilder buffer = new StringBuilder();
    buffer.append("CREATE TABLE ");
    buffer.append(table.getName());
    buffer.append(" (");
    for (int i = 0; i < table.getColumns().length; i++) {
      Column column = table.getColumn(i);
      ...
    }
    ...
    return buffer.toString();
  }

}
Run Code Online (Sandbox Code Playgroud)