Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 静态和非静态访问值_Java_Function_Casting_Static - Fatal编程技术网

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);
        }
    }
}