# HG changeset patch # User Jaroslav Tulach # Date 1213430018 -7200 # Node ID af48bccb02cb9419e5cd219a36d743e2c1ff1f8b # Parent 22c1953e372c59721c5f4820f0df73a1b7025f38 Finished re-reading of "classes vs. interfaces" diff -r 22c1953e372c -r af48bccb02cb samples/growingparameters/nbproject/project.xml --- a/samples/growingparameters/nbproject/project.xml Sat Jun 14 09:53:37 2008 +0200 +++ b/samples/growingparameters/nbproject/project.xml Sat Jun 14 09:53:38 2008 +0200 @@ -60,8 +60,12 @@ src-api1.0 + + src-api2.0 + + - impl + src-impl build.xml diff -r 22c1953e372c -r af48bccb02cb samples/growingparameters/src-api1.0/api/classes/Support.java --- a/samples/growingparameters/src-api1.0/api/classes/Support.java Sat Jun 14 09:53:37 2008 +0200 +++ b/samples/growingparameters/src-api1.0/api/classes/Support.java Sat Jun 14 09:53:38 2008 +0200 @@ -1,17 +1,8 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - package api.classes; import java.util.Iterator; import java.util.List; -/** - * - * @author Jaroslav Tulach - */ public class Support { private Support() { } diff -r 22c1953e372c -r af48bccb02cb samples/growingparameters/src-api1.0/api/request/response/Compute.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/growingparameters/src-api1.0/api/request/response/Compute.java Sat Jun 14 09:53:38 2008 +0200 @@ -0,0 +1,31 @@ +package api.request.response; + +import java.util.List; + +public interface Compute { + public void computeData(Request request, Response response); + + /** Right now useless, but may be handy in future */ + public final class Request { + /** allow access just from friend code */ + Request() { + } + } + + /** Allows clients to provide the computed strings */ + public final class Response { + private final List result; + /** Allow access only to friend code */ + Response(List result) { + this.result = result; + } + + public void add(String s) { + this.result.add(s); + } + + public void addAll(List all) { + this.result.addAll(all); + } + } +} diff -r 22c1953e372c -r af48bccb02cb samples/growingparameters/src-api1.0/api/request/response/Support.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/growingparameters/src-api1.0/api/request/response/Support.java Sat Jun 14 09:53:38 2008 +0200 @@ -0,0 +1,27 @@ +package api.request.response; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +public class Support { + private Support() { + } + + public static int searchByName(String name, Compute provider) { + List result = new ArrayList(); + Compute.Request request = new Compute.Request(); + Compute.Response response = new Compute.Response(result); + + provider.computeData(request, response); + + Iterator it = result.iterator(); + for (int i = 0; it.hasNext(); i++) { + if (name.equals(it.next())) { + return i; + } + } + return -1; + } + +} diff -r 22c1953e372c -r af48bccb02cb samples/growingparameters/src-api2.0/api/request/response/Compute.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/growingparameters/src-api2.0/api/request/response/Compute.java Sat Jun 14 09:53:38 2008 +0200 @@ -0,0 +1,40 @@ +package api.request.response; + +import java.util.List; +import java.util.Map; + +// BEGIN: grow.request.response +public interface Compute { + public void computeData(Request request, Response response); + + public final class Request { + // only getters public, rest hidden only for friend code + Request() { + } + } + + public final class Response { + // only setters public, rest available only for friend code + private final Map result; + /** Allow access only to friend code */ + Response(Map result) { + this.result = result; + } + + public void add(String s) { + this.result.put(s, s); + } + + public void addAll(List all) { + for (String s : all) { + add(s); + } + } + + /** @since 2.0 */ + public void add(String s, String description) { + this.result.put(s, description); + } + } +} +// END: grow.request.response diff -r 22c1953e372c -r af48bccb02cb samples/growingparameters/src-api2.0/api/request/response/Support.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/growingparameters/src-api2.0/api/request/response/Support.java Sat Jun 14 09:53:38 2008 +0200 @@ -0,0 +1,44 @@ +package api.request.response; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class Support { + private Support() { + } + + public static int searchByName(String name, Compute provider) { + Map result = new LinkedHashMap(); + Compute.Request request = new Compute.Request(); + Compute.Response response = new Compute.Response(result); + + provider.computeData(request, response); + + Iterator it = result.keySet().iterator(); + for (int i = 0; it.hasNext(); i++) { + if (name.equals(it.next())) { + return i; + } + } + return -1; + } + + public static int searchByDescription(String name, Compute provider) { + Map result = new LinkedHashMap(); + Compute.Request request = new Compute.Request(); + Compute.Response response = new Compute.Response(result); + + provider.computeData(request, response); + + Iterator it = result.values().iterator(); + for (int i = 0; it.hasNext(); i++) { + if (name.equals(it.next())) { + return i; + } + } + return -1; + } +} diff -r 22c1953e372c -r af48bccb02cb samples/growingparameters/src-impl/impl/Impl.java --- a/samples/growingparameters/src-impl/impl/Impl.java Sat Jun 14 09:53:37 2008 +0200 +++ b/samples/growingparameters/src-impl/impl/Impl.java Sat Jun 14 09:53:38 2008 +0200 @@ -1,26 +1,35 @@ package impl; -import api.classes.Compute; -import api.classes.Support; import java.util.Collections; import java.util.List; import java.util.Map; public class Impl { public static void main(String[] args) { - class ProviderWrittenAgainstVersion1 extends Compute { + System.err.println("showUsageOfAbstractClassAPI:"); + showUsageOfAbstractClassAPI(); + System.err.println("showUsageOfRequestResponseAPI:"); + showUsageOfRequestResponseAPI(); + } + + private static void assertEquals(String msg, int expected, int real) { + System.err.println(" " + msg + " expected: " + expected + " was: " + real); + assert expected == real; + } + + private static void showUsageOfAbstractClassAPI() { + class ProviderWrittenAgainstVersion1 extends api.classes.Compute { @Override public List getData() { return Collections.singletonList("Hello"); } } - int index1 = Support.searchByDescription("Hello", new ProviderWrittenAgainstVersion1()); - assert index1 == 0; - int index2 = Support.searchByDescription("Unknown", new ProviderWrittenAgainstVersion1()); - assert index2 == -1; - + int index1 = api.classes.Support.searchByDescription("Hello", new ProviderWrittenAgainstVersion1()); + assertEquals("Hello was found", 0, index1); + int index2 = api.classes.Support.searchByDescription("Unknown", new ProviderWrittenAgainstVersion1()); + assertEquals("Unknown was not found", -1, index2); - class ProviderWrittenAgainstVersion2 extends Compute { + class ProviderWrittenAgainstVersion2 extends api.classes.Compute { @Override public List getData() { return Collections.singletonList("Hello"); @@ -32,7 +41,31 @@ } } - int index3 = Support.searchByDescription("Says hello", new ProviderWrittenAgainstVersion2()); + int index3 = api.classes.Support.searchByDescription("Says hello", new ProviderWrittenAgainstVersion2()); + assertEquals("Found by description", 0, index3); + } + + + + private static void showUsageOfRequestResponseAPI() { + class ProviderWrittenAgainstVersion1 implements api.request.response.Compute { + public void computeData(Request request, Response response) { + response.add("Hello"); + } + } + int index1 = api.request.response.Support.searchByDescription("Hello", new ProviderWrittenAgainstVersion1()); + assertEquals("Hello found", 0, index1); + int index2 = api.request.response.Support.searchByDescription("Unknown", new ProviderWrittenAgainstVersion1()); + assertEquals("Unknown not found", -1, index2); + + class ProviderWrittenAgainstVersion2 implements api.request.response.Compute { + public void computeData(Request request, Response response) { + response.add("Hello", "Says hello"); + } + } + + int index3 = api.request.response.Support.searchByDescription("Says hello", new ProviderWrittenAgainstVersion2()); + assertEquals("Description found", 0, index3); assert index3 == 0; } }