AStringHistoryDelegatorUser.java |
package lectures.generics_adapters; import util.annotations.WebDocuments; import java.util.ArrayList; import java.util.List; import lectures.arrays.collections_implementation.AStringHistory; import lectures.inheritance.InheritingStringDatabase; /** * This class better illustrates the concept of least privilege. * * It shows how a history can be modeled by ArrayList directly or by * AStringHistoryDelegator * * Answer the questions below. */ @WebDocuments({"Lectures/GenericsAdapters.pptx", "Lectures/GenericsAdapters.pdf", "Videos/GenericsAdapters.avi"}) public class AStringHistoryDelegatorUser { final static String EXAMPLE_STRING = "0"; public static void useListDirectly() { List<String> aStringHistory = new ArrayList<String>(); aStringHistory.add(EXAMPLE_STRING); /* * Uncomment the following when asked */ // aStringHistory.remove("EXAMPLE_STRING"); } public static void useHistory() { History<String> aStringHistory = new AStringHistoryDelegator(); aStringHistory.addElement(EXAMPLE_STRING); /* * Uncomment the following when asked */ // aStringHistory.removeElement(EXAMPLE_STRING)); } public static void main(String[] args){ useListDirectly(); useHistory(); } } /* * Recall that the least privilege principle says that the users of an object should * not be able to perform unauthorized operations - operations not needed to their tasks. * * Recall that a history is a collection from which elements cannot be removed. * * Uncomment the line in useListDirectly. * * (Multiple choice) Removing an element from aStringHistory in useListDirectly leads to a: * (a) compile-time error. * (b) runtime error. * (c) violation of the least privilege principle. * (d) none of the above. * * (Multiple choice) Removing an element from aStringHistory in useHistory leads to a: * (a) compile-time error. * (b) runtime error. * (c) violation of least principle. * (d) none of the above. * * (T/F) Adapting a class rather than using it directly can reduce least privilege violations. * * AStringHistory is an adapter of ArrayList. * * The limitation of operations on a class is one common use of adapters and delegation. * * Another way that adapters in can be useful is in cases where code might expect particular * naming and parameters of methods in a class, but the class (not written by us) uses different * naming. We can write methods in a form that we find useful that simply pass on the work to * the delegate. * * Why would a proxy ever be useful, if it has the same names and methods (since it implements * the same interface)? Proxies are used in more specialized situations where they tweak how we * interact with a class. For example they might restrict access to the delegate object based * on access rights, or help the code use the delegate object by forwarding it requests if it * is actually connected over a network. Server proxies are used to cache results in a server * near you. */