Java 静态和非静态访问值
我有一个名为Java 静态和非静态访问值,java,function,casting,static,Java,Function,Casting,Static,我有一个名为Packet的类,还有一个名为PacketClientConnecting的类扩展了它。PacketClientConnecting和其他数据包的实例存储在ArrayList中 我想以static和non-static方式访问id值,例如PacketClientConnecting.getStaticId()或packetArrayList.get(5).getId() 如何在不重写每个类中的两个函数的情况下做到这一点?我认为没有一种真正平滑的方法可以做到这一点,但是可以通过使用反射
Packet
的类,还有一个名为PacketClientConnecting
的类扩展了它。PacketClientConnecting
和其他数据包的实例存储在ArrayList
中
我想以static
和non-static
方式访问id值,例如PacketClientConnecting.getStaticId()
或packetArrayList.get(5).getId()
如何在不重写每个类中的两个函数的情况下做到这一点?我认为没有一种真正平滑的方法可以做到这一点,但是可以通过使用反射(仅一次:在基类中)来实现您想要的: 现在,在子类中,您只需要定义getStaticId(): 让我们测试一下:
class Main {
public static void main(String[] args) {
// Both print 1
System.out.println(Packet.getStaticId());
System.out.println(new Packet().getId());
// Both print 2
System.out.println(PacketClientConnecting.getStaticId());
System.out.println(new PacketClientConnecting().getId());
}
}
如果希望避免每次调用getId()时调用反射操作的开销,可以使用基类中的字段来缓存id:
class Packet {
public static int getStaticId() {
return 1;
}
private final int id = computeId();
public int getId() {
return id;
}
// This method runs once per instance created
private int computeId() {
try {
Method getStaticId = this.getClass().getMethod("getStaticId");
return (Integer) getStaticId.invoke(null);
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
}
您面临的实际问题是什么?能否在基类中包含列表?PacketClientConnection.getStaticId()是否有参数?它是什么类型的?如果getStaticId(x)只返回x.getId(),则不必重写它。但这只是一个猜测,因为我并不确定你想要完成什么。你面临的实际问题是什么?我必须在每个包类中复制两个函数(静态和非静态)。我认为这不是最好的方法。你能把这个列表放在基类中吗?否。^PacketClientConnection.getStaticId()是否有参数?不,每个数据包只有一个id。我想按class.getId()或instance.getId()获取它。实例作为数据包存储在ArrayList中。
class Main {
public static void main(String[] args) {
// Both print 1
System.out.println(Packet.getStaticId());
System.out.println(new Packet().getId());
// Both print 2
System.out.println(PacketClientConnecting.getStaticId());
System.out.println(new PacketClientConnecting().getId());
}
}
class Packet {
public static int getStaticId() {
return 1;
}
private final int id = computeId();
public int getId() {
return id;
}
// This method runs once per instance created
private int computeId() {
try {
Method getStaticId = this.getClass().getMethod("getStaticId");
return (Integer) getStaticId.invoke(null);
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
}