आपको कठिनाई हो रही है क्योंकि आप गलत पैटर्न का उपयोग कर रहे हैं।
आपके Task
एस को अगले राज्य को वापस नहीं करना चाहिए। प्रवाह को नियंत्रित करने के लिए आपको State
एस के मैट्रिक्स का उपयोग करना चाहिए। इस तरह आपका प्रवाह कार्यों के अंदर उलझन में नहीं है और State
एस प्रवाह प्रणाली के लिए निजी रहता है।
यदि आप प्रवाह को नियंत्रित करने के लिए अपने Task
चाहते हैं तो उन्हें प्रवाह नियंत्रक को प्रभावित करने के लिए कुछ (शायद सफलता/विफलता) वापस करनी चाहिए। उन्हें को अगले राज्य को परिभाषित नहीं करना चाहिए, उन्हें अगले राज्य को प्रभावित करना चाहिए।
जोड़ा गया
यहाँ मैं क्या मतलब है की एक से थोड़ा काल्पनिक उदाहरण है। ध्यान दें कि Task
एस प्रत्येक State
से कैसे जुड़े होते हैं और प्रवाह Map
द्वारा नियंत्रित होता है जो केवल प्रत्येक राज्य संक्रमण को नियंत्रित करता है।
मैंने आपके लौटने वाले परिणामों से मेल खाने के लिए एक टोकन प्रयास किया है, लेकिन मुझे संदेह है कि केवल मामलों को खत्म कर देता है और एक बार जब आप राज्य से प्रवाह को अलग करते हैं तो आपको पता चलेगा कि मैं क्या समझाने की कोशिश कर रहा हूं।
public class Test {
public void test() {
new Thread(new Engine()).start();
}
static final Map<State, State> flow = new HashMap<>();
static {
flow.put(State.Start, State.A);
flow.put(State.A, State.B);
flow.put(State.B, State.Finished);
}
public static class Engine implements Runnable {
State state = State.Start;
@Override
public void run() {
while (state != State.Finished) {
System.out.println("State: "+state);
// Perform all tasks of this state.
for (Task task : state.tasks) {
System.out.println("Task: "+task);
Result result = Result.Start;
// Keep performing until completed.
while (result != Result.Completed) {
System.out.println("Result: "+result);
result = result.perform(task);
}
System.out.println("Result: "+result);
}
// All tasks performed! Next state.
state = flow.get(state);
}
System.out.println("State: "+state);
}
}
enum State {
Start,
A(Task.One, Task.Two),
B(Task.Two),
Finished;
Iterable<Task> tasks;
State(Task... tasks) {
this.tasks = Arrays.asList(tasks);
}
}
enum Result {
Start {
@Override
Result perform(Task t) {
return t.initialise();
}
},
Executing {
@Override
Result perform(Task t) {
return t.execute();
}
},
Finalising {
@Override
Result perform(Task t) {
return t.finalise();
}
},
Completed {
@Override
Result perform(Task t) {
// Stop there.
return Completed;
}
};
abstract Result perform(Task t);
}
enum Task {
One {
@Override
Result initialise() {
return Result.Executing;
}
@Override
Result execute() {
return Result.Finalising;
}
@Override
Result finalise() {
return Result.Completed;
}
},
Two {
@Override
Result initialise() {
return Result.Executing;
}
@Override
Result execute() {
return Result.Finalising;
}
@Override
Result finalise() {
return Result.Completed;
}
};
abstract Result initialise();
abstract Result execute();
abstract Result finalise();
}
public static void main(String args[]) {
try {
new Test().test();
} catch (Throwable t) {
t.printStackTrace(System.err);
}
}
}
जोड़ा गया
आपकी आवश्यकता को हटाने कार्य विधियों में से परिणामों के माध्यम से प्रवाह को नियंत्रित करने के द्वारा इस सरल बनाना हम पाते हैं:
public class Test {
public void test() {
new Thread(new Engine()).start();
}
static final Map<State, State> flow = new HashMap<>();
static {
flow.put(State.Start, State.A);
flow.put(State.A, State.B);
flow.put(State.B, State.Finished);
}
public static class Engine implements Runnable {
State state = State.Start;
@Override
public void run() {
while (state != State.Finished) {
System.out.println("State: "+state);
// Perform all tasks of this state.
for (Task task : state.tasks) {
System.out.println("Task: "+task);
task.initialise();
task.execute();
task.finalise();
}
// All tasks performed! Next state.
state = flow.get(state);
}
System.out.println("State: "+state);
}
}
enum State {
Start,
A(Task.One, Task.Two),
B(Task.Two),
Finished;
Iterable<Task> tasks;
State(Task... tasks) {
this.tasks = Arrays.asList(tasks);
}
}
enum Task {
One {
@Override
void execute() {
}
},
Two {
@Override
void execute() {
}
};
// Nothing by default.
void initialise() {
}
abstract void execute();
// Nothing by default.
void finalise() {
}
}
public static void main(String args[]) {
try {
new Test().test();
} catch (Throwable t) {
t.printStackTrace(System.err);
}
}
}
जो, मुझे लगता है, यह दर्शाता है की जुदाई कार्य निष्पादन से प्रवाह नियंत्रण मैं पार करने की कोशिश कर रहा था।
नहीं, आप कुछ enum स्थिरांक सार्वजनिक और कुछ पैकेज-निजी चिह्नित नहीं कर सकते हैं। –
इस मामले में शायद आप पुराने जावा एनम्स का उपयोग कर सकते हैं, केवल कुछ वर्ग स्थिर स्थिर स्थिरांक वाले वर्ग। – Marcelo
वास्तव में, आप उन्हें कुछ भी चिह्नित नहीं कर सकते हैं। वे 'सार्वजनिक' हैं और यही वह है। –