2016-08-29 6 views
2

Я думаю, что немного смутил себя - как бы то ни было, как вызвать метод по другому методу. Метод method(). Method(). Method(); ? Я хотел бы создать подобный метод себя для этого образца кода:Метод JAVA, вызывающий метод

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(); что-то класс ЮНА RECT обеспечивает (сверху, снизу, слева, правильно). Как мне это сделать?

Заранее спасибо :)

+0

Метод1(). Method2() действителен, если метод1 возвращает объект, который может вызвать метод2 –

ответ

3

Для того, чтобы сделать это возможным, необходимо беглые API.

Смысл: каждый из ваших методов ... должен вернуть часть объект; как:

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

, а затем, когда все ваши а() S и B() s возвращение что-то, вы можете записать такой код.

И если вы «оставаться» в пределах же класса, и каждый метод просто делает

return this; 

так что вы держите вызова методов того же объекта; чем это как-то приемлемая практика.

Для любых других случаев: вы должны быть очень осторожны в этом! Поскольку эта практика в этом случае означает: нарушение Law of Demeter.

Дело в том, что класс должен знать только о своих прямых соседях. Вы не хотите писать код, например,

myField.doSomething().inSomeOtherClass().andNow2HopsAway() ... 

потому что этот код присваивает совершенно другому классу.

Краткая история: не строить свободно API для удовольствия. Внимательно изучите, где они имеют смысл; и никогда не забывайте о Законе Деметры!

EDIT; прочитав ваши вопросы и комментарии более тщательно; Я думаю, вы не только путать себя, но и нас:

как сейчас

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

И сверху, слева, ... являются поля на RECT.

Таким образом, вы получите

int whatever = foo.getPositionOfClient().top; 

Done. Это поле; вам не нужно ничего, но используйте «.top», например, когда ваш метод уже возвращает RECT!

+0

Если миним anonymous-downvote все еще вокруг; любезно объясните, что мотивировало ваше действие. – GhostCat

+0

Я вижу вашу точку зрения, однако было бы разумно сделать это свободно для getRect(). GetTop(); Вместо того, чтобы иметь 4 разных метода, которые независимо возвращают верх, низ, вправо и влево? - Я отбросил тебя вверх, чтобы выровнять нисходящее. Я ценю ваш ответ! –

+0

Как сказано; это зависит от вашего контекста. Большой вопрос: что такое «хорошее» возвращаемое значение для метода, называемого getTop() - еще один RECT? Будет ли это то же, что и getRect(), дало вам - или то, что «сверху» RECT из getRect() ?! – GhostCat

0

Вы не вызываете метод по другому методу, вы вызываете метод в возвращаемом значении другого метода.method().method().method(); является только юридическим кодом, если method() возвращает тип, который сам имеет имена методов method(). Для вашего кода вам просто нужен какой-то тип. getPositionOfTop() возвращает себе getTop() и getBottom().

0

Методы называются объектом. То, что вы называете методом/property on, должно быть объектом. Если вы хотите выполнить цепочку методов, каждый метод должен вернуть значение, которое фактически является объектом. (За исключением последнего метода). Классы, предназначенные для использования в цепочке методов, просто возвращают себя как возвращаемое значение метода.

0

Не похоже, что вы вызываете метод() по другому методу. Для примера:

У вас есть строка json, которая сопоставляется с классом Pojo Demo. Итак, теперь вы используете библиотеку Gson Class gson api, которая используется для преобразования строки json в Class Object.

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

Итак, здесь Gson(), который является методом конструктора, возвращает объект класса Gson.

new Gson() 

Теперь мы можем вызвать метод fromJson (String, ClassofT) с помощью объекта, возвращенного Gson Конструктора. Этот метод преобразует данную json-строку в объект Demo Class Object.

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

Затем мы вызываем метод toString класса Demo для печати нашей информации. Таким образом, вы можете видеть, что вы можете вызывать метод объекта возвращаемого типа и действителен, если этот метод существует для этого объекта.