This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
java:interface_implementation [2017/03/31 13:13] gthanos |
java:interface_implementation [2019/04/05 17:20] (current) gthanos [LinkedStack] |
||
|---|---|---|---|
| Line 5: | Line 5: | ||
| Σε συνέχεια του προηγούμενου παραδείγματος θα επιχειρήσουμε να δημιουργήσουμε δύο διαφορετικές κλάσεις που υλοποιούν το συγκεκριμένο //interface//. Οι κλάσεις αυτές είναι **SimpleTimer** και **StartStopTimer**. Και οι δύο κλάσεις παρέχουν την ίδια λειτουργικότητα. | Σε συνέχεια του προηγούμενου παραδείγματος θα επιχειρήσουμε να δημιουργήσουμε δύο διαφορετικές κλάσεις που υλοποιούν το συγκεκριμένο //interface//. Οι κλάσεις αυτές είναι **SimpleTimer** και **StartStopTimer**. Και οι δύο κλάσεις παρέχουν την ίδια λειτουργικότητα. | ||
| - | ==== SimpleTimer ==== | + | ===== ArrayStack ===== |
| - | <code java SimpleTimer.java> | + | <code java ArrayStack.java> |
| - | class SimpleTimer implements Timer { | + | public class ArrayStack implements Stack { |
| - | private long start_time, duration; | + | public int capacity; |
| - | private boolean running = false; | + | public Object []array; |
| - | + | public int size; | |
| - | public void setTimer(int seconds) { | + | |
| - | duration = seconds * 1000; | + | |
| - | } | + | |
| | | ||
| - | public boolean startTimer() { | + | public ArrayStack() { |
| - | Date now = new Date(); | + | this(256); |
| - | //System.err.println("[startTimer] duration: "+duration); | + | |
| - | if(duration > 0) { | + | |
| - | start_time = now.getTime(); | + | |
| - | running = true; | + | |
| - | //System.err.println("[startTimer] Running again!"); | + | |
| - | } | + | |
| - | else { | + | |
| - | //System.err.println("[startTimer] Failed to start!"); | + | |
| - | running = false; | + | |
| - | } | + | |
| - | return running; | + | |
| } | } | ||
| | | ||
| - | public void stopTimer() { | + | public ArrayStack(int capacity) { |
| - | Date now = new Date(); | + | array = new Object[capacity]; |
| - | if( running && now.getTime() > start_time) | + | this.capacity = capacity; |
| - | duration -= now.getTime() - start_time; | + | size = 0; |
| - | running = false; | + | |
| } | } | ||
| | | ||
| - | public boolean isRunning() { | + | public int size() { |
| - | return running; | + | return size; |
| } | } | ||
| | | ||
| - | public boolean hasExpired() { | + | public void push(Object o) { |
| - | Date now = new Date(); | + | |
| - | //System.err.println("[hasExpired] running: "+running); | + | if( size >= capacity-1 ) { |
| - | if( (running && now.getTime() - start_time >= duration) || duration <= 0 ) { | + | capacity *= 2; |
| - | start_time = 0L; | + | Object []newArray = new Object[capacity]; |
| - | duration = 0L; | + | for(int i=0; i<array.length; i++) |
| - | running = false; | + | newArray[i] = array[i]; |
| - | return true; | + | array = newArray; |
| + | newArray = null; | ||
| } | } | ||
| - | return false; | + | array[size++] = o; |
| + | } | ||
| + | |||
| + | public Object pop() { | ||
| + | return array[--size]; | ||
| + | } | ||
| + | |||
| + | public Object top() { | ||
| + | return array[size-1]; | ||
| } | } | ||
| | | ||
| + | public String toString() { | ||
| + | String str = "@@@@@@@@ - Stack - @@@@@@@@\n"; | ||
| + | for(int i=size-1; i>=0; i--) | ||
| + | str += array[i].toString()+"\n"; | ||
| + | return str + "@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"; | ||
| + | } | ||
| } | } | ||
| </code> | </code> | ||
| - | ===== StartStopTimer ===== | + | ===== ListStack ===== |
| - | <code java StartStopTimer.java> | + | <code java ListStack.java> |
| - | class StartStop implements Timer { | + | import java.util.*; |
| - | private long start_time, duration; | + | public class ListStack implements Stack { |
| - | ArrayList starts = new ArrayList(); | + | private ArrayList list; |
| - | ArrayList stops = new ArrayList(); | + | |
| - | private boolean running = false; | + | public ListStack() { |
| - | + | list = new ArrayList(); | |
| - | public void setTimer(int seconds) { | + | |
| - | duration = seconds * 1000; | + | |
| } | } | ||
| - | public boolean startTimer() { | + | |
| - | long now = new Date().getTime(); | + | public int size() { |
| - | if(!running) { | + | return list.size(); |
| - | starts.add(now); | + | |
| - | running = true; | + | |
| - | } | + | |
| - | return running; | + | |
| } | } | ||
| - | public void stopTimer() { | + | |
| - | long now = new Date().getTime(); | + | public void push(Object o) { |
| - | if(running) { | + | list.add(o); |
| - | stops.add(now); | + | |
| - | running = false; | + | |
| - | } | + | |
| } | } | ||
| - | public boolean isRunning() { | + | |
| - | return running; | + | public Object pop() { |
| + | return list.remove(list.size()-1); | ||
| } | } | ||
| | | ||
| - | public boolean hasExpired() { | + | public Object top() { |
| - | if( !running ) | + | return list.get(list.size()-1); |
| - | return running; | + | |
| - | long runtime = 0L; | + | |
| - | for(int i=0; i<stops.size(); i++) { | + | |
| - | runtime += (long)((Long)stops.get(i) - (Long)starts.get(i)); | + | |
| - | } | + | |
| - | long now = new Date().getTime(); | + | |
| - | runtime += now - (Long)starts.get(stops.size()); | + | |
| - | if( running && runtime > duration ) { | + | |
| - | start_time = 0; | + | |
| - | duration = 0; | + | |
| - | running = false; | + | |
| - | return true; | + | |
| - | } | + | |
| - | return false; | + | |
| } | } | ||
| + | | ||
| + | public String toString() { | ||
| + | String str = "@@@@@@@@ - Stack - @@@@@@@@\n"; | ||
| + | for(Object o : list) | ||
| + | str += o.toString()+"\n"; | ||
| + | return str + "@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"; | ||
| + | } | ||
| } | } | ||
| </code> | </code> | ||
| - | Παραπάνω έχουμε υλοποιήσει το συγκεκριμένο //interface// μέσα από δύο διαφορετικές κλάσεις. Αν και η υλοποίηση των κλάσεων διαφέρει σημαντικά, η λειτουργικότητα που παρέχουν είναι ισοδύναμη. Μπορείτε να χρησιμοποιήσετε οποιαδήποτε από της δύο κλάσεις για να εξυπηρετήσετε τη λειτουργικότητα του //interface// **Timer** σε ένα πρόγραμμα. | + | Παραπάνω έχουμε υλοποιήσει το συγκεκριμένο //interface// μέσα από δύο διαφορετικές κλάσεις. Αν και η υλοποίηση των κλάσεων διαφέρει σημαντικά, η λειτουργία τους είναι κοινή. Μπορείτε να χρησιμοποιήσετε οποιαδήποτε από της δύο κλάσεις για να εξυπηρετήσετε τη λειτουργικότητα του //interface// **Stack** σε ένα πρόγραμμα. |
| - | | Προηγούμενο : [[ :java:interface_implementation | Υλοποίηση του interface ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ :java:interface_as_data_type | Το interface ως τύπος δεδομένων ]] | | + | | Προηγούμενο : [[ :java:interface_definition | Δήλωση του interface ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ :java:interface_as_data_type | Το interface ως τύπος δεδομένων ]] | |