JAVA 方法调用方法

JAVA method calling upon method

我想我自己有点困惑 - 无论如何,我如何在另一个方法上调用一个方法。喜欢 method().method().method(); ? 我想自己为这个示例代码创建一个类似的方法:

public RECT getPositionOfClient() {
    HWND client = User32.INSTANCE.FindWindow("classname", "client");
    RECT rect = new RECT();
    User32.INSTANCE.GetWindowRect(client , rect);
    System.out.println("rect = " + rect);
    return rect;
}

我想在这里打电话 getPositionOfClient().getTop(); or getPositionOfClient().getBottom(); 这是 JNA RECT class 提供的(顶部、底部、左侧、右侧)。 我该怎么做?

提前致谢:)

为了实现这一点,您需要 流畅 API。

意思是:你的每个方法...都必须return一些对象;喜欢:

Whatever a() { ... does something ... and 
 return whatEverInstance;
}

然后,当你所有的a(),b()都return的时候,你就可以写下这样的代码了。

并且如果您 "stay" 在 中使用相同的 class,并且每个方法只执行一个

return this;

所以你一直在同一个对象上调用方法;这在某种程度上是可以接受的做法。

对于任何其他情况:你应该非常小心地这样做! 由于这种做法在那种情况下意味着:违反Law of Demeter

重点是:class 应该只知道它的直接邻居。你不想写像

这样的代码
myField.doSomething().inSomeOtherClass().andNow2HopsAway() ...

因为这将此代码与完全不同的 class 结合在一起。

长话短说:不要为了好玩而构建 流畅 API。仔细考虑它们有意义的地方;永远不要忘记 Demeter 法则!

编辑;在更彻底地阅读您的问题和评论之后;我想你不仅把自己弄糊涂了,也把我们弄糊涂了:

截至目前

public RECT getPositionOfClient() { ... returns an instance of RECT }

顶部、左侧...是 RECT 上的字段

所以你得到

int whatever = foo.getPositionOfClient().top;

完成。这是一个领域;例如,当您的方法已经 returning RECT!

时,您不需要其他任何东西,只需使用“.top”

你不是在另一个方法上调用一个方法,你是在另一个方法的 return 值 上调用一个方法。 method().method().method(); 仅当 method() return 是一种本身具有方法名称 method() 的类型时才是合法代码。对于您的代码,您只需要任何类型 getPositionOfTop() returns 本身具有 getTop()getBottom().

方法被对象调用。你称之为 method/property 的东西,必须是一个对象。 如果要进行方法链接,每个方法都应该 return 一个实际上是对象的值。 (最后一种方法除外)。 类 被设计为可用于方法链 return 本身作为方法的 return 值。

它不像你在另一个方法上调用 method() 。例如:

您有一个 json 字符串映射到名为 Demo 的 Pojo class。所以现在你使用的是 gson api 的 Gson Class 库,它用于将 json 字符串转换为 Class 对象。

new Gson().fromJson(inputString,Demo.class).toString().

所以这里的 Gson() 是 Gson class 的构造方法 return 对象。

new Gson()

现在我们可以使用 Gson 构造函数 returned 的对象调用 fromJson(String, ClassofT) 方法。此方法将给定的 json 字符串转换为 Demo Class 对象。

new Gson().fromJson(inputString,Demo.class)

然后我们调用Demo的toString方法class打印我们的信息。因此,正如您所看到的,您可以在 return 类型的对象上调用方法,并且如果该对象存在该方法则有效。