如何在 java 中连接字段?

  • 本文关键字:连接 字段 java java
  • 更新时间 :
  • 英文 :


在我的项目中,我遇到了一个我无法快速谷歌的情况。 我有几个对象,并在每个对象的 id 字段中写入一个值,当我稍后更改此 id 时,我需要更新每个对象的 id 字段中的值。示例b = null; a = b; => a = null;例如,在b = 3之后,有必要在不再次a = b的情况下更新a = 3的值。我将尝试更详细地解释。

class Student { private Long id; } 
class Class { private Long id; } 
Student s = new Student (); 
Class c = new Class (); 
c.getid = null; 
s.setId (c.getId); => s.getId == null;

经过一些操作c.getId == 1;s.getId == null如何在没有s.setId (c.getId)的情况下做s.getId == 1

这可能吗?

b = 3

,有必要更新 a = 3 的值,而无需 a = b 再。这可能吗?

如果字段ab是基元数据类型,则 no。您需要同时更新ab

如果ab是对象上的实例,那么是的,因为ab共享相同的内存引用。因此,如果您的字段是原始数据类型,您可以使用适当的 set/get 方法将它们包装在自定义对象中,您就可以开始了。

如果这些字段可以由多线程并发读取/写入,则在访问它们时可能还需要确保互斥。

正如我所怀疑的,你的问题实际上是一个XY问题,你吠错了树。解决方案不是更改学生的 ID,而是将引用传递到需要的地方。在这里,我怀疑id代表一个班级的id,因此最好的解决方案是给班级一个ArrayList<Student>字段(因为它将容纳多个学生),并给你的学生一个ArrayList<Class>字段(因为一个学生可以参加多个班级)。

然后,当学生注册课程(通过某种方法)时,将该班级添加到其班级列表中,并将该学生添加到班级的学生列表中。

例如,

public class Student {
private int id;
private List<Class> classes = new ArrayList<>();

// constructor, getters, setters

public void addClass(Class class) {
classes.add(class);
}

// also removeClass method, a getClasses method...
}
public class Class {
private int id;
private List<Student> students = new ArrayList<>();

// constructor, getters, setters

public void addStudent(Student student) {
students.add(student);
}

// also removeStudent method, a getStudents method...
}

感谢您对问题的良好解释,但如果您告诉我们原因会更好。 买路,我觉得这是一个XY问题,更重要的问题是"你为什么需要这个"?

让我们谈谈您的问题,您应该考虑的选择很少。

  1. ab的类型是原始的 由于原语有自己的记忆(不指向其他地方),就像 C 语言一样,在赋值之后,没有任何东西将ab联系起来,它们可以(并且将)单独更改。 例如
int a, b;
a = 3;
b = a;
a = 5;
// b is still 3
  1. ab是引用,您希望它们指向同一对象。 对象在堆中,并且由于没有赋值重载(就像我们在 cpp 中一样),在赋值之后ab指向完全相同的对象,因此 a 指向的对象中的每个更改都将从 b 中看到。 但请记住,除非 a 和 b 指向同一对象并使用.操作对象状态;
class Student {
int id;
}
class Demo {
public static void main(String[] args) {
Student a, b;
a = new Student();
a.id = 3;
b = a;
// they are now pointing to same object
a.id = 5;
// b.id is 5 too, basically same int
b = null;
// now they are disconnect
// or maybe this: b = new Student()
}
}

我认为这可以帮助并回答您的问题,但让我们也讨论一下您的代码片段。

  1. 如果您希望引用本身更改。 例如:
String a, b;
a = "some string"
b = a;
a = null;
// b  should be null?

据我所知,Java中没有为您提供此功能,没有运算符重载或预处理器可以提供帮助。

但如果你坚持,我可以想到一些技巧

使用
  • C 或任何其他自定义预处理器并定义一些宏来执行此操作。 例如,在使用 Java 编译器编译之前,使用a重命名所有b变量。 检查这个
  • 定义一个单例对象(或只是一个虚拟类)并ab保留对该对象的引用,这实际上是情况 2 和 3 的组合;

使用静态类:

class Global {
static Object reference;
}
class Demo {
public static void main(String[] args) {
Global a = null, b = null;
a.reference  = "some string value";
b.reference = null;
// a.reference is null
}
}

和单例类:

class Singleton {
private static final Singleton instance = new Singleton();
public static Singleton getInstance() {
return Singleton.instance;
}
private Singleton() {}
Object ref;
}
class Demo {
public static void main(String[] args) {
Singleton a =  Singleton.getInstance();
Singleton b = a;
a.ref = "some string value";
b.ref = null;
// a.ref is null
System.out.println(a.ref);
}
}

(是的,我知道这不是你想要的,但java是语法级别的简单语言)