Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Java Iterators interface Collection { … Iterator iterator(); … } Interface Iterator { boolean hasNext() ; Object next() ; void remove() ; } interface Set extends Collection { … Iterator iterator(); … } Interface ListIterator extends Iterator { boolean hasNext() ; Object next() ; boolean hasPrevious() ; Object previous() ; int nextIndex() ; int previousIndex() ; void remove() ; void set(Object o) ; void add(Object o) ; } interface List extends Collection { … Iterator iterator(); ListIterator listIterator(); ListIterator listIterator(int index); … } Java Iterator import java.util.*; public class IteratorExample { public static void main(String[] args) { List ints = new ArrayList(); for(int i = 0; i < 10; i++) ints.add(new Integer(i)); Iterator e = ints.iterator(); while(e.hasNext()) System.out.println( ((Integer)e.next()).intValue() ) ; } } Object Serialization Object Serialization To represent an object in a byte-encoded format that can be stored and passed to a stream, and in need can be reconstructed. Live Object Live Object Frozen Object Stream Serialize DeSerialize Serialization ObjectOutputStream & ObjectInputStream Serialization can be used in. Remote Method Invocation (RMI), communication between objects via sockets. (Marshaling and unmarshaling objects) Archival of an object for use in a later invocation of the same program. Objects to be serialized Works like other input-output streams They can write and read Objects. ObjectOutputStream: Serializes Java Objects into a byte-encoded format, and writes them onto an OutputStream. ObjectInputStream: Reads and reconstructs Java Objects from a byteencoded format read from InputStream. Must implement Serializable interface Non-persistent fields can be marked with transient keyword The following is written and read during serialization Class of the object Class signature Values of all non-transient and non-static members Serialization To Write into an ObjectOutputStream FileOutputStream out = new FileOutputStream(“afile”) ; ObjectOutputStream oos = new ObjectOutputStream(out) ; oos.writeObject(“Today”) ; oos.writeObject(new Date()) ; oos.flush() ; To Read from an ObjectInputStream FileInputStream in = new FileInputStream(“afile”) ; ObjectInputStream ois = new ObjectInputStream(in) ; String today = (String) ois.readObject() ; Date date = (Date) ois.readObject() ; Serialization ObjectOutputStream.writeObject(Object) traverses all the internal references of the object recursively and writes all of them. ObjectOutputStream implements DataOutput interface to write primitive data types. writeInt(…), writeFloat(…), writeUTF(…), etc. ObjectInputStream implements DataInput interface ro read primitive data types. readInt(), readFloat(), readUTF(), etc. writeObject(Object) throws NotSerializableException if Object does not implement Serializable interface Object Serialization Example import java.io.* ; import java.util.* ; class A implements Serializable { public int i = 5 ; public String str = "Hi" ; public List l = new ArrayList() ; } public class ObjSerTest { public static void main(String[]args) { A a = new A() ; a.i = 10 ; a.str = "Hello" ; a.l.add("One") ; a.l.add("Two") ; serialize(a) ; } private static void serialize(A a) { System.out.println("Serializing..."); try { FileOutputStream fos = new FileOutputStream("test.out") ; ObjectOutputStream oos = new ObjectOutputStream(fos) ; oos.writeObject(a) ; } catch (Exception e) { System.err.println("Problem: "+e) ; } } } Object De-serialization Example import java.io.* ; import java.util.* ; class A implements Serializable { public int i = 5 ; public String str = "Hi" ; public List l = new ArrayList() ; } public class ObjDeSerTest { public static void main(String[]args) { A a = deserialize() ; System.out.println(a.i) ; System.out.println(a.str) ; System.out.println(a.l) ; } private static A deserialize() { System.out.println("DeSerializing..."); try { FileInputStream fis = new FileInputStream("test.out") ; ObjectInputStream iis = new ObjectInputStream(fis) ; return (A) iis.readObject() ; } catch (Exception e) { System.err.println("Problem: "+e) ; } return null ; } } Customizing Serialization To define writeObject() and readObject() to append additional information. private void writeObject(ObjectOutputStream oos) throws IOException { oos.defaultWriteObject() ; // customized serialization code } private void readObject(ObjectInputStream ois) throws IOException { ois.defaultReadObject() ; // customized deserialization code // if necessary, must include code to update the object } Externalizable interface To control the serialization process explicitly, Externalizable interface must be implemented. Externalizable interface public interface Externalizable extends Serializable { public void writeExternal(ObjectOutput out) throws IOException ; public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException ; } writeExternal and readExternal must save/load the state of the object. They must explicitly coordinate with its supertype to save its state. General Programming Tips General Programming Tips Try to write self-documented programs: Use logical variable names and function names : not : int x; but : int studentCount; Comments Use comments whenever something is unclear. Think that you are telling some other person about your code. (After a long time, this person might be you) Coding Conventions Class names start with Capital Instance names, fields, function names start with lower, etc. Object myObject ; int myInt ; void myFunc() { … Static Final variables are All-Capitalized class MyClass { static final MAXVALUE = 200 ; Necessary Tabs and spaces in Blocks. (Theoretically you can write a long program in a single line) General Programming Tips Use getter, setter, and is methods. int getCount() ; int setCount() ; isEmpty() ; Self-checking classes Use main() almost in every class to check class functionality. You can make an expected output check, in order to verify changes in the class. General Programming Tips In highly coupled classes, consider to make inner classes. Keep method definitions and scopes as short as possible. (For easy visualization and readability.) Compiler-time errors are better then run time errors. Prefer Interface definition to Abstract Class Spelling problems in overriding Classes Not : abstract class X { abstract void f() ; } But : interface X { void f() ; class X { void encode() { … } } class Y extends X { void Encode() { … } } Use Java Container Library classes List l = new ArrayList() ; Map hm = new HashMap() ; Set s = new HashSet() ; List myStack = new LinkedList() ; // Does not overload the method Debugging a program Handle Exceptions in their proper level. try { … } catch (Throwable) { … } // Bad Don’t output errors to System.out, but to System.err For Debugging code use a single global boolean variable showing the Debug mode. bDebug = true ; … if (bDebug) { // Print some information Care must be taken not to change any state inside. if (bDebug) { if (i++==0) … }