Java – can this loop code be simplified in some way?
•
Java
I have a problem... Basically my code is ugly and I don't like it I wonder if there is a way to simplify it (I use Java 8)
I have these "code blocks" that follow this pattern. I have about 5 or 6 in a method, so this method looks very repetitive and ugly
Loops are the same, but the code changes inside
Is there any way to simplify this?
Code block example
String id = null; for (int i=0; i< NUM_CHECKS; i++) { // BEGIN VARIABLE CODE id = getPrice(); if (id != null) break; // END VARIABLE CODE // sleep between checks if (i < NUM_CHECKS -1) Thread.sleep(DELAY); }
example
String id = null; for (int i=0; i< NUM_CHECKS; i++) { // BEGIN VARIABLE CODE id = getPrice(); if (id != null) break; // END VARIABLE CODE // sleep between checks if (i < NUM_CHECKS -1) Thread.sleep(DELAY); } for (int i=0; i< NUM_CHECKS; i++) { // BEGIN VARIABLE CODE x=x*2; if (x>25) break; // END VARIABLE CODE // sleep between checks if (i < NUM_CHECKS -1) Thread.sleep(DELAY); } etc... a couple more blocks
Solution
How about coding abstractions to include all template files?
class MyLoop { private int numChecks; private int delay; public MyLoop(int numChecks,int delay) {...} public void loopAndSleep(MyTask task) throws InterruptedException { // Update: It is important to set properly the order of the looping conditions,// to stop invoking hasEnded() as soon as i<numChecks==false (Thaks to Simon Eismann). for (int i=0; i<numChecks && !task.hasEnded(); i++) { if (i < numChecks -1) { Thread.sleep(DELAY); } } } } interface MyTask { public boolean hasEnded(); }
Therefore, you can replace each of the 5-6 locations in the program by:
new MyLoop(NUM_CHECKS,DELAY).loopAndSleep(new MyTask(){...});
By properly extending mytask, you can provide them with specific state variables
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码