4

这在我的课程中没有涉及,我很难想出我想要这个的原因。我遇到了下面的代码:

OpenNetworking proxy = service.getPort(OpenNetworking.class);

在上面的行中,我可以看到它正在返回端口并将类传递给方法,但我读到它OpenNetworking.class是因为尚未实例化。我显然错过了一些东西。

4

6 回答 6

3

这是工厂方法模式的一个示例。

类类型被提供给服务以给出Port指定类型OpenNetworking

在这种情况下,类类型很方便,因为它是在创建对象时为对象提供唯一标识符的最简单方法。如果对象的状态随着包含对象的类型而改变,则不需要维护它class

于 2013-04-11T10:57:07.960 回答
2

这样做的原因有很多:

  1. 控制类的实例数:假设您想控制一个类的实例数,您可以将构造函数设为私有或包级别,并在有人调用您的方法时返回相同的实例
  2. 安全性:您可能希望您的类是安全的,并且通常不希望任何人实例化您的类。
  3. 依赖关系:您的类可能具有依赖关系,只能在运行时找出,然后服务类使用反射来适当地实例化类。
于 2013-04-11T11:03:08.587 回答
1

这里我们传递类类型(Java 中的类)。所以getPort方法中的处理是根据类的类型来完成的,我们不需要一个Object实例来处理它。当然,它与此代码不同(无法编译):

OpenNetworking proxy = service.getPort(new OpenNetworking());
于 2013-04-11T10:54:56.373 回答
0

显然,该方法的service.getPort();行为根据参数中的类型,想象有一个端口用于 openNetworking,另一个用于 closeNetworking,因此提供类名作为参数就足以获得所需的端口号,可以创建一个枚举但是扩展现有代码将迫使您也为每种类型扩展枚举。

于 2013-04-11T10:57:44.813 回答
0

同样由于泛型的限制,当你有一个泛型类/方法并且你需要创建一个新实例时,你将需要一个类。例如:

class SomeClass<T> {
    public static<T> T create() {
        return new T(); // will not work
    }

    public static<T> T create(Class<T> clazz) {
        return clazz.newInstance(); //will work
    }
}

所以你需要类实例来创建该类型的新对象。

于 2013-04-11T11:02:10.237 回答
0

使用的方法有这样的定义:

public <T> T getPort(Class<T> serviceEndpointInterface)

所以它返回一个扩展类 T 的对象的实例(代理,合成类实例)

于 2013-04-11T11:04:59.717 回答