From 7dfdab3a83bbb1d4280f0e010e620668691deaa9 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 27 May 2015 23:30:19 -0700 Subject: [PATCH] update --- annotations/build.xml | 2 +- annotations/ifx/IfaceExtractorProcessor.java | 32 +++--- annotations/simplest/SimpleProcessor.java | 27 +++-- annotations/simplest/SimpleTest.java | 4 + assertions/Queue.java | 2 +- containers/Unsupported.java | 3 +- generics/BankTeller.java | 5 +- generics/Mixins.cpp | 2 +- generics/Mixins.java | 4 +- generics/Wildcards.java | 9 +- generics/coffee/CoffeeGenerator.java | 2 +- gui/ComboBoxes.java | 7 +- gui/LookAndFeel.java | 4 +- gui/MonitoredLongRunningCallable.java | 5 +- gui/SineWave.java | 8 +- innerclasses/Factories.java | 19 +++- innerclasses/Games.java | 18 +++- innerclasses/build.xml | 5 + io/AvailableCharSets.java | 8 +- io/BufferToText.java | 2 +- logging/SimpleFilter.java | 21 ++-- logging/log.prop | 4 +- network/MultiSimpleClient.java | 2 +- patterns/CommandPattern.java | 3 +- patterns/PaperScissorsRock.java | 24 +---- patterns/ShapeFactory2.java | 32 ++---- patterns/absfactory/GameEnvironment.java | 4 +- patterns/build.xml | 5 + patterns/chain/ChainOfResponsibility.java | 99 +++++++++---------- patterns/doubledispatch/DoubleDispatch.java | 12 +-- patterns/dynatrash/DynaTrash.java | 1 + patterns/factory/ShapeFactory1.java | 8 +- patterns/recyclea/RecycleA.java | 25 ++--- patterns/recycleap/RecycleAP.java | 19 ++-- patterns/recycleb/RecycleB.java | 59 +++++------ patterns/strategy/StrategyPattern.java | 41 +++----- patterns/trash/Fillable.java | 4 +- patterns/trash/FillableList.java | 10 +- patterns/trash/ParseTrash.java | 15 ++- patterns/trash/Trash.java | 23 +++-- patterns/trashvisitor/TrashVisitor.java | 7 +- patterns/trashvisitor/Visitable.java | 1 - patterns/trashvisitor/Visitor.java | 1 - patterns/visualobserver/BoxObserver.java | 4 +- .../drc/DogAndRobotCollections.java | 12 +-- staticchecking/petspeak/PetSpeak.java | 4 +- swt/ColorBoxes.java | 11 +-- typeinfo/pets/ForNameCreator.java | 2 +- 48 files changed, 285 insertions(+), 336 deletions(-) diff --git a/annotations/build.xml b/annotations/build.xml index c9a05427..609e1b94 100644 --- a/annotations/build.xml +++ b/annotations/build.xml @@ -15,10 +15,10 @@ - + diff --git a/annotations/ifx/IfaceExtractorProcessor.java b/annotations/ifx/IfaceExtractorProcessor.java index e1b2ee64..ac5ac20e 100644 --- a/annotations/ifx/IfaceExtractorProcessor.java +++ b/annotations/ifx/IfaceExtractorProcessor.java @@ -15,14 +15,11 @@ public class IfaceExtractorProcessor extends AbstractProcessor { private ArrayList interfaceMethods = new ArrayList<>(); - Types typeUtils; Elements elementUtils; - private ProcessingEnvironment processingEnv; @Override public void init(ProcessingEnvironment processingEnv) { this.processingEnv = processingEnv; - typeUtils = processingEnv.getTypeUtils(); elementUtils = processingEnv.getElementUtils(); } @Override public boolean @@ -43,25 +40,11 @@ extends AbstractProcessor { interfaceMethods.add(enclosed); } } - if(interfaceMethods.size() > 0) { + if(interfaceMethods.size() > 0) writeInterfaceFile(interfaceName); - } } return false; } - private String createArgList( - List parameters) { - if(parameters.size() == 0) - return "()"; - String args = "("; - for(VariableElement p : parameters) { - args += p.asType() + " "; - args += p.getSimpleName() + ", "; - } - args = args.substring(0, args.length() - 2); - args += ")"; - return args; - } private void writeInterfaceFile(String interfaceName) { try { @@ -92,4 +75,17 @@ extends AbstractProcessor { throw new RuntimeException(e); } } + private String createArgList( + List parameters) { + if(parameters.size() == 0) + return "()"; + String args = "("; + for(VariableElement p : parameters) { + args += p.asType() + " "; + args += p.getSimpleName() + ", "; + } + args = args.substring(0, args.length() - 2); + args += ")"; + return args; + } } ///:~ diff --git a/annotations/simplest/SimpleProcessor.java b/annotations/simplest/SimpleProcessor.java index b905ca2e..433698a8 100644 --- a/annotations/simplest/SimpleProcessor.java +++ b/annotations/simplest/SimpleProcessor.java @@ -17,12 +17,27 @@ extends AbstractProcessor { for(TypeElement t : annotations) System.out.println(t); for(Element el : - env.getElementsAnnotatedWith(Simple.class)){ - System.out.println(el.getKind() + - " : " + el.getModifiers() + - " : " + el.getSimpleName() + - " : " + el.asType()); - } + env.getElementsAnnotatedWith(Simple.class)) + display(el); return false; } + private void display(Element el) { + System.out.println("==== " + el + " ===="); + System.out.println(el.getKind() + + " : " + el.getModifiers() + + " : " + el.getSimpleName() + + " : " + el.asType()); + if(el.getKind().equals(ElementKind.CLASS)) { + TypeElement te = (TypeElement)el; + System.out.println(te.getQualifiedName()); + System.out.println(te.getSuperclass()); + System.out.println(te.getEnclosedElements()); + } + if(el.getKind().equals(ElementKind.METHOD)) { + ExecutableElement ex = (ExecutableElement)el; + System.out.print(ex.getReturnType() + " "); + System.out.print(ex.getSimpleName() + "("); + System.out.println(ex.getParameters() + ")"); + } + } } ///:~ diff --git a/annotations/simplest/SimpleTest.java b/annotations/simplest/SimpleTest.java index b9369233..5ab0d1ab 100644 --- a/annotations/simplest/SimpleTest.java +++ b/annotations/simplest/SimpleTest.java @@ -13,6 +13,10 @@ public class SimpleTest { System.out.println("SimpleTest.foo()"); } @Simple + public void bar(String s, int i, float f) { + System.out.println("SimpleTest.bar()"); + } + @Simple public static void main(String[] args) { @Simple SimpleTest st = new SimpleTest(); diff --git a/assertions/Queue.java b/assertions/Queue.java index e3da47f9..dc34e8da 100644 --- a/assertions/Queue.java +++ b/assertions/Queue.java @@ -1,5 +1,5 @@ //: assertions/Queue.java -// Demonstration of Design by Contract (DBC) combined +// Demonstration of Design by Contract (DbC) combined // with white-box unit testing. // (Install libraries from www.junit.org) import java.util.*; diff --git a/containers/Unsupported.java b/containers/Unsupported.java index 353d30d8..dad37cfc 100644 --- a/containers/Unsupported.java +++ b/containers/Unsupported.java @@ -41,8 +41,7 @@ public class Unsupported { test("Modifiable Copy", new ArrayList<>(list)); test("Arrays.asList()", list); test("unmodifiableList()", - Collections.unmodifiableList( - new ArrayList<>(list))); + Collections.unmodifiableList(new ArrayList<>(list))); } } /* Output: --- Modifiable Copy --- diff --git a/generics/BankTeller.java b/generics/BankTeller.java index 2514922c..fffb82b1 100644 --- a/generics/BankTeller.java +++ b/generics/BankTeller.java @@ -11,7 +11,7 @@ class Customer { public String toString() { return "Customer " + id; } // A method to produce Generator objects: public static Generator generator() { - return () -> new Customer(); + return Customer::new; // Constructor reference } } @@ -22,8 +22,7 @@ class Teller { @Override public String toString() { return "Teller " + id; } // A single Generator object: - public static Generator generator = - () -> new Teller(); + public static Generator generator = Teller::new; } public class BankTeller { diff --git a/generics/Mixins.cpp b/generics/Mixins.cpp index 4873b827..b5d100ab 100644 --- a/generics/Mixins.cpp +++ b/generics/Mixins.cpp @@ -30,7 +30,7 @@ public: }; int main() { - TimeStamped > mixin1, mixin2; + TimeStamped> mixin1, mixin2; mixin1.set("test string 1"); mixin2.set("test string 2"); cout << mixin1.get() << " " << mixin1.getStamp() << diff --git a/generics/Mixins.java b/generics/Mixins.java index 81028370..6f982589 100644 --- a/generics/Mixins.java +++ b/generics/Mixins.java @@ -22,8 +22,8 @@ class SerialNumberedImp implements SerialNumbered { } interface Basic { - public void set(String val); - public String get(); + void set(String val); + String get(); } class BasicImp implements Basic { diff --git a/generics/Wildcards.java b/generics/Wildcards.java index d257c11b..847b248b 100644 --- a/generics/Wildcards.java +++ b/generics/Wildcards.java @@ -29,13 +29,11 @@ public class Wildcards { Object obj = holder.get(); } static T exact1(Holder holder) { - T t = holder.get(); - return t; + return holder.get(); } static T exact2(Holder holder, T arg) { holder.set(arg); - T t = holder.get(); - return t; + return holder.get(); } static T wildSubtype(Holder holder, T arg) { @@ -43,8 +41,7 @@ public class Wildcards { // set(capture of ? extends T) in // Holder // cannot be applied to (T) - T t = holder.get(); - return t; + return holder.get(); } static void wildSupertype(Holder holder, T arg) { diff --git a/generics/coffee/CoffeeGenerator.java b/generics/coffee/CoffeeGenerator.java index 09e20ac5..87a626c9 100644 --- a/generics/coffee/CoffeeGenerator.java +++ b/generics/coffee/CoffeeGenerator.java @@ -37,7 +37,7 @@ implements Generator, Iterable { public void remove() { // Not implemented throw new UnsupportedOperationException(); } - }; + } @Override public Iterator iterator() { return new CoffeeIterator(); diff --git a/gui/ComboBoxes.java b/gui/ComboBoxes.java index e491ffdd..48e4d694 100644 --- a/gui/ComboBoxes.java +++ b/gui/ComboBoxes.java @@ -21,10 +21,9 @@ public class ComboBoxes extends JFrame { if(count < description.length) c.addItem(description[count++]); }); - c.addActionListener(e -> { - t.setText("index: "+ c.getSelectedIndex() + " " + - ((JComboBox)e.getSource()).getSelectedItem()); - }); + c.addActionListener(e -> t.setText("index: " + + c.getSelectedIndex() + " " + + ((JComboBox)e.getSource()).getSelectedItem())); setLayout(new FlowLayout()); add(t); add(c); diff --git a/gui/LookAndFeel.java b/gui/LookAndFeel.java index da684e65..348a5bbe 100644 --- a/gui/LookAndFeel.java +++ b/gui/LookAndFeel.java @@ -14,8 +14,8 @@ public class LookAndFeel extends JFrame { new JLabel("JLabel"), new JCheckBox("JCheckBox"), new JRadioButton("Radio"), - new JComboBox(choices), - new JList(choices), + new JComboBox<>(choices), + new JList<>(choices), }; public LookAndFeel() { super("Look And Feel"); diff --git a/gui/MonitoredLongRunningCallable.java b/gui/MonitoredLongRunningCallable.java index 26b491b3..a6493b32 100644 --- a/gui/MonitoredLongRunningCallable.java +++ b/gui/MonitoredLongRunningCallable.java @@ -26,9 +26,8 @@ class MonitoredCallable implements Callable { if(monitor.isCanceled()) Thread.currentThread().interrupt(); final int progress = i; - SwingUtilities.invokeLater(() -> { - monitor.setProgress(progress); - }); + SwingUtilities.invokeLater(() -> + monitor.setProgress(progress)); } } catch(InterruptedException e) { monitor.close(); diff --git a/gui/SineWave.java b/gui/SineWave.java index 236b079f..b1e9b31b 100644 --- a/gui/SineWave.java +++ b/gui/SineWave.java @@ -47,12 +47,8 @@ public class SineWave extends JFrame { private JSlider adjustCycles = new JSlider(1, 30, 5); public SineWave() { add(sines); - adjustCycles.addChangeListener(new ChangeListener() { - public void stateChanged(ChangeEvent e) { - sines.setCycles( - ((JSlider)e.getSource()).getValue()); - } - }); + adjustCycles.addChangeListener(e -> sines.setCycles( + ((JSlider)e.getSource()).getValue())); add(BorderLayout.SOUTH, adjustCycles); } public static void main(String[] args) { diff --git a/innerclasses/Factories.java b/innerclasses/Factories.java index 81e8ef5e..81eb59fd 100644 --- a/innerclasses/Factories.java +++ b/innerclasses/Factories.java @@ -26,12 +26,18 @@ class Implementation2 implements Service { private Implementation2() {} public void method1() {print("Implementation2 method1");} public void method2() {print("Implementation2 method2");} + // Use method reference instead: public static ServiceFactory factory = - new ServiceFactory() { - public Service getService() { - return new Implementation2(); - } - }; + Implementation2::new; // Constructor reference +} + +class Implementation3 implements Service { + private Implementation3() {} + public void method1() {print("Implementation3 method1");} + public void method2() {print("Implementation3 method2");} + // Use lambda expression instead: + public static ServiceFactory factory = + () -> new Implementation3(); } public class Factories { @@ -44,10 +50,13 @@ public class Factories { serviceConsumer(Implementation1.factory); // Implementations are completely interchangeable: serviceConsumer(Implementation2.factory); + serviceConsumer(Implementation3.factory); } } /* Output: Implementation1 method1 Implementation1 method2 Implementation2 method1 Implementation2 method2 +Implementation3 method1 +Implementation3 method2 *///:~ diff --git a/innerclasses/Games.java b/innerclasses/Games.java index 7e53863a..1f8b7a1f 100644 --- a/innerclasses/Games.java +++ b/innerclasses/Games.java @@ -27,9 +27,20 @@ class Chess implements Game { print("Chess move " + moves); return ++moves != MOVES; } - public static GameFactory factory = new GameFactory() { - public Game getGame() { return new Chess(); } - }; + // Use a lambda expression instead: + public static GameFactory factory = () -> new Chess(); +} + +class TicTacToe implements Game { + private TicTacToe() {} + private int moves = 0; + private static final int MOVES = 4; + public boolean move() { + print("TicTacToe move " + moves); + return ++moves != MOVES; + } + // Use a method reference instead: + public static GameFactory factory = TicTacToe::new; } public class Games { @@ -41,6 +52,7 @@ public class Games { public static void main(String[] args) { playGame(Checkers.factory); playGame(Chess.factory); + playGame(TicTacToe.factory); } } /* Output: Checkers move 0 diff --git a/innerclasses/build.xml b/innerclasses/build.xml index 3d6de3bc..89602857 100644 --- a/innerclasses/build.xml +++ b/innerclasses/build.xml @@ -8,10 +8,12 @@ + + @@ -20,6 +22,7 @@ + @@ -34,9 +37,11 @@ + + diff --git a/io/AvailableCharSets.java b/io/AvailableCharSets.java index 5aff8897..0c6e1518 100644 --- a/io/AvailableCharSets.java +++ b/io/AvailableCharSets.java @@ -8,12 +8,10 @@ public class AvailableCharSets { public static void main(String[] args) { SortedMap charSets = Charset.availableCharsets(); - Iterator it = charSets.keySet().iterator(); - while(it.hasNext()) { - String csName = it.next(); + for(String csName : charSets.keySet()) { printnb(csName); - Iterator aliases = - charSets.get(csName).aliases().iterator(); + Iterator aliases = charSets.get(csName) + .aliases().iterator(); if(aliases.hasNext()) printnb(": "); while(aliases.hasNext()) { diff --git a/io/BufferToText.java b/io/BufferToText.java index 29226975..d0b9b0ff 100644 --- a/io/BufferToText.java +++ b/io/BufferToText.java @@ -23,7 +23,7 @@ public class BufferToText { String encoding = System.getProperty("file.encoding"); System.out.println("Decoded using " + encoding + ": " + Charset.forName(encoding).decode(buff)); - // Or, we could encode with something that will print: + // Or, we could encode with something that prints: fc = new FileOutputStream("data2.txt").getChannel(); fc.write(ByteBuffer.wrap( "Some text".getBytes("UTF-16BE"))); diff --git a/logging/SimpleFilter.java b/logging/SimpleFilter.java index 53d98b5f..a2f071ee 100644 --- a/logging/SimpleFilter.java +++ b/logging/SimpleFilter.java @@ -14,18 +14,15 @@ public class SimpleFilter { } public static void main(String[] args) { sendLogMessages(); - logger.setFilter(new Filter() { - public boolean - isLoggable(LogRecord record) { - Object[] params = - record.getParameters(); - if(params == null) - return true; // No parameters - if(record.getParameters()[0] - instanceof Duck) - return true; // Only log Ducks - return false; - } + logger.setFilter(record -> { + Object[] params = + record.getParameters(); + if(params == null) + return true; // No parameters + if(record.getParameters()[0] + instanceof Duck) + return true; // Only log Ducks + return false; }); logger.info("After setting filter.."); sendLogMessages(); diff --git a/logging/log.prop b/logging/log.prop index 68e11480..66031eb6 100644 --- a/logging/log.prop +++ b/logging/log.prop @@ -15,9 +15,9 @@ config = ConfigureLogging java.util.logging.FileHandler.pattern = java%g.log # Write 100000 bytes before rotating this file java.util.logging.FileHandler.limit = 100000 -# Number of rotating files to be used +# Number of rotating files java.util.logging.FileHandler.count = 3 -# Formatter to be used with this FileHandler +# Formatter for this FileHandler java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter # Configure ConsoleHandler diff --git a/network/MultiSimpleClient.java b/network/MultiSimpleClient.java index 5d6b4568..b801d5d9 100644 --- a/network/MultiSimpleClient.java +++ b/network/MultiSimpleClient.java @@ -24,7 +24,7 @@ class SimpleClientThread extends Thread { new Socket(addr, MultiSimpleServer.PORT); } catch(IOException e) { // If the creation of the socket fails, - // nothing needs to be cleaned up. + // nothing needs cleanup. } try { in = diff --git a/patterns/CommandPattern.java b/patterns/CommandPattern.java index b6e3f9c3..efd58562 100644 --- a/patterns/CommandPattern.java +++ b/patterns/CommandPattern.java @@ -33,8 +33,7 @@ class Macro implements Command { public void add(Command c) { commands.add(c); } @Override public void execute() { - for(Command c : commands) - c.execute(); + commands.forEach(Command::execute); } } diff --git a/patterns/PaperScissorsRock.java b/patterns/PaperScissorsRock.java index e7bf35dc..89d93f2f 100644 --- a/patterns/PaperScissorsRock.java +++ b/patterns/PaperScissorsRock.java @@ -2,29 +2,7 @@ // Demonstration of multiple dispatching. import java.util.*; -// An enumeration type: -class Outcome { - private int value; - private Outcome(int val) { value = val; } - public final static Outcome - WIN = new Outcome(0), - LOSE = new Outcome(1), - DRAW = new Outcome(2); - @Override - public String toString() { - switch(value) { - default: - case 0: return "win"; - case 1: return "lose"; - case 2: return "draw"; - } - } - @Override - public boolean equals(Object o) { - return (o instanceof Outcome) - && (value == ((Outcome)o).value); - } -} +enum Outcome { WIN, LOSE, DRAW } interface Item { Outcome compete(Item it); diff --git a/patterns/ShapeFactory2.java b/patterns/ShapeFactory2.java index 6e126069..b95b7434 100644 --- a/patterns/ShapeFactory2.java +++ b/patterns/ShapeFactory2.java @@ -1,6 +1,7 @@ //: patterns/ShapeFactory2.java // Polymorphic factory methods. import java.util.*; +import java.util.function.*; import static net.mindview.util.Print.*; class BadShapeCreation extends Exception { @@ -15,8 +16,7 @@ interface Shape { } abstract class ShapeFactory { - protected abstract Shape create(); - static Map factories = + static Map> factories = new HashMap<>(); static Shape createShape(String id) throws BadShapeCreation { @@ -30,7 +30,7 @@ abstract class ShapeFactory { if(!factories.containsKey(id)) throw new BadShapeCreation(id); } - return factories.get(id).create(); + return factories.get(id).get(); } } @@ -38,15 +38,8 @@ class Circle implements Shape { private Circle() {} public void draw() { print("Circle.draw"); } public void erase() { print("Circle.erase"); } - static class Factory extends ShapeFactory { - @Override - protected Shape create() { - return new Circle(); - } - } static { - ShapeFactory.factories.put( - "Circle", new Circle.Factory()); + ShapeFactory.factories.put("Circle", Circle::new); } } @@ -54,15 +47,8 @@ class Square implements Shape { private Square() {} public void draw() { print("Square.draw"); } public void erase() { print("Square.erase"); } - static class Factory extends ShapeFactory { - @Override - protected Shape create() { - return new Square(); - } - } static { - ShapeFactory.factories.put( - "Square", new Square.Factory()); + ShapeFactory.factories.put("Square", Square::new); } } @@ -80,11 +66,7 @@ public class ShapeFactory2 { e.printStackTrace(); return; } - Iterator i = shapes.iterator(); - while(i.hasNext()) { - Shape s = i.next(); - s.draw(); - s.erase(); - } + shapes.forEach(Shape::draw); + shapes.forEach(Shape::erase); } } ///:~ diff --git a/patterns/absfactory/GameEnvironment.java b/patterns/absfactory/GameEnvironment.java index 676ff336..295a225e 100644 --- a/patterns/absfactory/GameEnvironment.java +++ b/patterns/absfactory/GameEnvironment.java @@ -72,13 +72,11 @@ implements GameElementFactory { } public class GameEnvironment { - private GameElementFactory gef; private Player p; private Obstacle ob; public GameEnvironment( GameElementFactory factory) { - gef = factory; - p = factory.makePlayer(); + p = factory.makePlayer(); ob = factory.makeObstacle(); } public void play() { diff --git a/patterns/build.xml b/patterns/build.xml index 1c408c6c..aea81da7 100644 --- a/patterns/build.xml +++ b/patterns/build.xml @@ -8,6 +8,8 @@ + + @@ -16,8 +18,10 @@ + + @@ -27,6 +31,7 @@ + diff --git a/patterns/chain/ChainOfResponsibility.java b/patterns/chain/ChainOfResponsibility.java index 19a9aa72..b955c6d9 100644 --- a/patterns/chain/ChainOfResponsibility.java +++ b/patterns/chain/ChainOfResponsibility.java @@ -1,87 +1,86 @@ //: patterns/chain/ChainOfResponsibility.java package patterns.chain; +import java.util.*; +import static net.mindview.util.PrintArray.*; -class FindMinima { - private FindMinima successor = null; - public void add(FindMinima succ) { - FindMinima end = this; - while(end.successor != null) - end = end.successor; // Traverse list - end.successor = succ; +class Result { + boolean success; + double[] line; + public Result(double[] data) { + success = true; + line = data; } - public double[] algorithm(double[] line) { - if(successor != null) - return successor.algorithm(line); - else // Try the next one in the chain: - return new double[] {}; + public Result() { + success = false; + line = new double[] {}; } } -class LeastSquares extends FindMinima { - @Override - public double[] algorithm(double[] line) { +class Fail extends Result {} + +interface Algorithm { + Result algorithm(double[] line); +} + +class LeastSquares implements Algorithm { + public Result algorithm(double[] line) { System.out.println("LeastSquares.algorithm"); boolean weSucceed = false; if(weSucceed) // Actual test/calculation here - return new double[] { 1.1, 2.2 }; // Dummy + return new Result(new double[] { 1.1, 2.2 }); else // Try the next one in the chain: - return super.algorithm(line); + return new Fail(); } } -class Perturbation extends FindMinima { - @Override - public double[] algorithm(double[] line) { +class Perturbation implements Algorithm { + public Result algorithm(double[] line) { System.out.println("Perturbation.algorithm"); boolean weSucceed = false; if(weSucceed) // Actual test/calculation here - return new double[] { 3.3, 4.4 }; // Dummy - else // Try the next one in the chain: - return super.algorithm(line); + return new Result(new double[] { 3.3, 4.4 }); + else + return new Fail(); } } -class Bisection extends FindMinima { - @Override - public double[] algorithm(double[] line) { +class Bisection implements Algorithm { + public Result algorithm(double[] line) { System.out.println("Bisection.algorithm"); boolean weSucceed = true; if(weSucceed) // Actual test/calculation here - return new double[] { 5.5, 6.6 }; // Dummy + return new Result(new double[] { 5.5, 6.6 }); else - return super.algorithm(line); + return new Fail(); } } -// The "Handler" proxies to the first functor: -class MinimaSolver { - private FindMinima chain = new FindMinima(); - void add(FindMinima newAlgorithm) { - chain.add(newAlgorithm); - } - // Make the call to the top of the chain: - double[] minima(double[] line) { - return chain.algorithm(line); +class FindMinima { + List algorithms = Arrays.asList( + new LeastSquares(), + new Perturbation(), + new Bisection() + ); + public Result minima(double[] line) { + for (Algorithm alg : algorithms) { + Result result = alg.algorithm(line); + if(result.success) + return result; + } + return new Fail(); } } public class ChainOfResponsibility { - public static void printArray(double[] array) { - for(int i = 0; i < array.length; i++) { - System.out.print(array[i]); - if(i != array.length -1) - System.out.print(", "); - } - System.out.println(); - } public static void main(String args[]) { - MinimaSolver solver = new MinimaSolver(); - solver.add(new LeastSquares()); - solver.add(new Perturbation()); - solver.add(new Bisection()); + FindMinima solver = new FindMinima(); double[] line = { 1.0, 2.0, 1.0, 2.0, -1.0, 3.0, 4.0, 5.0, 4.0 }; - printArray(solver.minima(line)); + Result result = solver.minima(line); + if(result.success) + printArray(result.line); + else + System.out.println("No algorithm found"); } } ///:~ diff --git a/patterns/doubledispatch/DoubleDispatch.java b/patterns/doubledispatch/DoubleDispatch.java index c8acc1b8..dd6a4fd5 100644 --- a/patterns/doubledispatch/DoubleDispatch.java +++ b/patterns/doubledispatch/DoubleDispatch.java @@ -41,10 +41,8 @@ class TrashBinSet { new CardboardBin() }; public void sortIntoBins(ArrayList bin) { - Iterator e = bin.iterator(); - while(e.hasNext()) { - TypedBinMember t = - (TypedBinMember)e.next(); + for(Object aBin : bin) { + TypedBinMember t = (TypedBinMember)aBin; if(!t.addToBin(binSet)) System.err.println("Couldn't add " + t); } @@ -54,18 +52,16 @@ class TrashBinSet { public class DoubleDispatch { public static void main(String[] args) { - ArrayList bin = new ArrayList(); + ArrayList bin = new ArrayList<>(); TrashBinSet bins = new TrashBinSet(); // ParseTrash still works, without changes: ParseTrash.fillBin("DDTrash.dat", bin); // Sort from the master bin into the // individually-typed bins: bins.sortIntoBins(bin); - TypedBin[] tb = bins.binSet(); // Perform sumValue for each bin... - for(TypedBin tb1 : tb) { + for(TypedBin tb1 : bins.binSet()) Trash.sumValue(tb1.v); - } // ... and for the master bin Trash.sumValue(bin); } diff --git a/patterns/dynatrash/DynaTrash.java b/patterns/dynatrash/DynaTrash.java index a041d815..84574977 100644 --- a/patterns/dynatrash/DynaTrash.java +++ b/patterns/dynatrash/DynaTrash.java @@ -40,6 +40,7 @@ class TypeMapAdapter implements Fillable { } public class DynaTrash { + @SuppressWarnings("unchecked") public static void main(String[] args) { TypeMap bin = new TypeMap<>(); ParseTrash.fillBin("Trash.dat", diff --git a/patterns/factory/ShapeFactory1.java b/patterns/factory/ShapeFactory1.java index 004ffc75..2af944d1 100644 --- a/patterns/factory/ShapeFactory1.java +++ b/patterns/factory/ShapeFactory1.java @@ -53,11 +53,7 @@ public class ShapeFactory1 { e.printStackTrace(); return; } - Iterator i = shapes.iterator(); - while(i.hasNext()) { - Shape s = i.next(); - s.draw(); - s.erase(); - } + shapes.forEach(Shape::draw); + shapes.forEach(Shape::erase); } } ///:~ diff --git a/patterns/recyclea/RecycleA.java b/patterns/recyclea/RecycleA.java index a25b6f89..793d9109 100644 --- a/patterns/recyclea/RecycleA.java +++ b/patterns/recyclea/RecycleA.java @@ -9,11 +9,9 @@ abstract class Trash { abstract double value(); double weight() { return weight; } // Sums the value of Trash in a bin: - static void sumValue(List bin) { - Iterator e = bin.iterator(); + static void sumValue(List bin) { double val = 0.0f; - while(e.hasNext()) { - Trash t = e.next(); + for(Trash t : bin) { // Polymorphism in action: val += t.weight() * t.value(); System.out.println( @@ -75,21 +73,18 @@ public class RecycleA { bin.add(new Glass(Math.random() * 100)); } - List - glassBin = new ArrayList<>(), - paperBin = new ArrayList<>(), - alBin = new ArrayList<>(); - Iterator sorter = bin.iterator(); + List glassBin = new ArrayList<>(); + List paperBin = new ArrayList<>(); + List alBin = new ArrayList<>(); // Sort the Trash: - while(sorter.hasNext()) { - Trash t = sorter.next(); - // RTTI to show class membership: + for(Trash t : bin) { + // RTTI to discover Trash type: if(t instanceof Aluminum) - alBin.add(t); + alBin.add((Aluminum)t); if(t instanceof Paper) - paperBin.add(t); + paperBin.add((Paper)t); if(t instanceof Glass) - glassBin.add(t); + glassBin.add((Glass)t); } Trash.sumValue(alBin); Trash.sumValue(paperBin); diff --git a/patterns/recycleap/RecycleAP.java b/patterns/recycleap/RecycleAP.java index 5726f4e6..83d5ccea 100644 --- a/patterns/recycleap/RecycleAP.java +++ b/patterns/recycleap/RecycleAP.java @@ -9,21 +9,18 @@ public class RecycleAP { ArrayList bin = new ArrayList<>(); // Fill up the Trash bin: ParseTrash.fillBin("Trash.dat", bin); - ArrayList - glassBin = new ArrayList<>(), - paperBin = new ArrayList<>(), - alBin = new ArrayList<>(); - Iterator sorter = bin.iterator(); + List glassBin = new ArrayList<>(); + List paperBin = new ArrayList<>(); + List alBin = new ArrayList<>(); // Sort the Trash: - while(sorter.hasNext()) { - Trash t = sorter.next(); - // RTTI to show class membership: + for(Trash t : bin) { + // RTTI to discover Trash type: if(t instanceof Aluminum) - alBin.add(t); + alBin.add((Aluminum)t); if(t instanceof Paper) - paperBin.add(t); + paperBin.add((Paper)t); if(t instanceof Glass) - glassBin.add(t); + glassBin.add((Glass)t); } Trash.sumValue(alBin); Trash.sumValue(paperBin); diff --git a/patterns/recycleb/RecycleB.java b/patterns/recycleb/RecycleB.java index c64ee386..7366582d 100644 --- a/patterns/recycleb/RecycleB.java +++ b/patterns/recycleb/RecycleB.java @@ -4,59 +4,54 @@ package patterns.recycleb; import patterns.trash.*; import java.util.*; -// A vector that admits only the right type: -class Tbin extends ArrayList { - Class binType; - Tbin() { - this.binType = binType; +// A List that admits only the right type: +class Tbin extends ArrayList { + Class binType; + Tbin(Class type) { + binType = type; } - boolean grab(T t) { + @SuppressWarnings("unchecked") + boolean grab(Trash t) { // Comparing class types: if(t.getClass().equals(binType)) { - add(t); + add((T)t); // Downcast to this TBin's type return true; // Object grabbed } return false; // Object not grabbed } } -class TbinList extends ArrayList { //(*1*) - @SuppressWarnings("unchecked") - boolean sort(Trash t) { - Iterator e = iterator(); - while(e.hasNext()) { - Tbin bin = (Tbin)e.next(); - if(bin.grab(t)) return true; - } +class TbinList +extends ArrayList> { // (1) + boolean sort(T t) { + for(Tbin ts : this) + if(ts.grab(t)) + return true; return false; // bin not found for t } - void sortBin(Tbin bin) { // (*2*) - Iterator e = bin.iterator(); - while(e.hasNext()) - if(!sort((Trash)e.next())) - System.out.println("Bin not found"); + void sortBin(Tbin bin) { // (2) + for(T aBin : bin) + if(!sort(aBin)) + System.err.println("Bin not found"); } } public class RecycleB { - static Tbin bin = new Tbin<>(); - @SuppressWarnings("unchecked") + static Tbin bin = new Tbin<>(Trash.class); public static void main(String[] args) { // Fill up the Trash bin: ParseTrash.fillBin("Trash.dat", bin); - TbinList trashBins = new TbinList(); - trashBins.add(new Tbin()); - trashBins.add(new Tbin()); - trashBins.add(new Tbin()); - // add one line here: (*3*) - trashBins.add(new Tbin()); + TbinList trashBins = new TbinList<>(); + trashBins.add(new Tbin<>(Aluminum.class)); + trashBins.add(new Tbin<>(Paper.class)); + trashBins.add(new Tbin<>(Glass.class)); + // add one line here: (3) + trashBins.add(new Tbin<>(Cardboard.class)); - trashBins.sortBin(bin); // (*4*) + trashBins.sortBin(bin); // (4) - Iterator e = trashBins.iterator(); - while(e.hasNext()) - Trash.sumValue(e.next()); + trashBins.forEach(Trash::sumValue); Trash.sumValue(bin); } } ///:~ diff --git a/patterns/strategy/StrategyPattern.java b/patterns/strategy/StrategyPattern.java index 2d81cb86..346a9e84 100644 --- a/patterns/strategy/StrategyPattern.java +++ b/patterns/strategy/StrategyPattern.java @@ -1,31 +1,30 @@ //: patterns/strategy/StrategyPattern.java package patterns.strategy; +import java.util.function.*; +import static net.mindview.util.PrintArray.*; -// The strategy interface: -interface FindMinima { - // Line is a sequence of points: - double[] algorithm(double[] line); +// The common strategy base type: +class FindMinima { + Function algorithm; } // The various strategies: -class LeastSquares implements FindMinima { - @Override - public double[] algorithm(double[] line) { - return new double[] { 1.1, 2.2 }; // Dummy +class LeastSquares extends FindMinima { + LeastSquares() { + // Line is a sequence of points (Dummy data): + algorithm = (line) -> new double[] { 1.1, 2.2 }; } } -class Perturbation implements FindMinima { - @Override - public double[] algorithm(double[] line) { - return new double[] { 3.3, 4.4 }; // Dummy +class Perturbation extends FindMinima { + Perturbation() { + algorithm = (line) -> new double[] { 3.3, 4.4 }; } } -class Bisection implements FindMinima { - @Override - public double[] algorithm(double[] line) { - return new double[] { 5.5, 6.6 }; // Dummy +class Bisection extends FindMinima { + Bisection() { + algorithm = (line) -> new double[] { 5.5, 6.6 }; } } @@ -36,7 +35,7 @@ class MinimaSolver { strategy = strat; } double[] minima(double[] line) { - return strategy.algorithm(line); + return strategy.algorithm.apply(line); } void changeAlgorithm(FindMinima newAlgorithm) { strategy = newAlgorithm; @@ -44,14 +43,6 @@ class MinimaSolver { } public class StrategyPattern { - public static void printArray(double[] array) { - for(int i = 0; i < array.length; i++) { - System.out.print(array[i]); - if(i != array.length -1) - System.out.print(", "); - } - System.out.println(); - } public static void main(String args[]) { MinimaSolver solver = new MinimaSolver(new LeastSquares()); diff --git a/patterns/trash/Fillable.java b/patterns/trash/Fillable.java index dd2ae91e..d6dc6430 100644 --- a/patterns/trash/Fillable.java +++ b/patterns/trash/Fillable.java @@ -2,6 +2,6 @@ // Any object that can be filled with Trash. package patterns.trash; -public interface Fillable { - void addTrash(Trash t); +public interface Fillable { + void addTrash(T t); } ///:~ diff --git a/patterns/trash/FillableList.java b/patterns/trash/FillableList.java index a0fbac3a..976a2a7b 100644 --- a/patterns/trash/FillableList.java +++ b/patterns/trash/FillableList.java @@ -3,12 +3,12 @@ package patterns.trash; import java.util.*; -public class FillableList -implements Fillable { - private ArrayList v; - public FillableList(ArrayList vv) { +public class FillableList +implements Fillable { + private ArrayList v; + public FillableList(ArrayList vv) { v = vv; } @Override - public void addTrash(Trash t) { v.add(t); } + public void addTrash(T t) { v.add(t); } } ///:~ diff --git a/patterns/trash/ParseTrash.java b/patterns/trash/ParseTrash.java index 6a1f115d..d16744f0 100644 --- a/patterns/trash/ParseTrash.java +++ b/patterns/trash/ParseTrash.java @@ -6,8 +6,8 @@ import java.util.*; import java.io.*; public class ParseTrash { - public static void - fillBin(String filename, Fillable bin) { + public static void + fillBin(String filename, Fillable bin) { try { try (BufferedReader data = new BufferedReader( new FileReader(filename))) { @@ -24,17 +24,16 @@ public class ParseTrash { new Trash.Info(type, weight))); } } - } catch(IOException e) { - e.printStackTrace(); - } catch(NumberFormatException | + } catch(IOException | + NumberFormatException | Trash.PrototypeNotFoundException | Trash.CannotCreateTrashException e) { e.printStackTrace(); } } // Special case to handle ArrayList: - public static void - fillBin(String filename, ArrayList bin) { - fillBin(filename, new FillableList(bin)); + public static void + fillBin(String filename, ArrayList bin) { + fillBin(filename, new FillableList<>(bin)); } } ///:~ diff --git a/patterns/trash/Trash.java b/patterns/trash/Trash.java index cb5194fd..4437784e 100644 --- a/patterns/trash/Trash.java +++ b/patterns/trash/Trash.java @@ -6,16 +6,17 @@ import java.lang.reflect.*; public abstract class Trash { private double weight; - Trash(double wt) { weight = wt; } - Trash() {} + public Trash(double wt) { weight = wt; } + public Trash() {} public abstract double value(); public double weight() { return weight; } // Sums the value of Trash in a bin: - public static void sumValue(List bin) { - Iterator e = bin.iterator(); + public static + void sumValue(List bin) { + Iterator e = bin.iterator(); double val = 0.0f; while(e.hasNext()) { - Trash t = e.next(); + T t = e.next(); val += t.weight() * t.value(); System.out.println("weight of " + // Using RTTI to get type @@ -34,23 +35,21 @@ public abstract class Trash { private static List trashTypes = new ArrayList<>(); @SuppressWarnings("unchecked") - public static Trash factory(Info info) + public static T factory(Info info) throws PrototypeNotFoundException, CannotCreateTrashException { for(Class trashType : trashTypes) { // Somehow determine the new type // to create, and create one: - Class tc = trashType; - if(tc.getName().contains(info.id)) { + if(trashType.getName().contains(info.id)) { try { // Get the dynamic constructor method // that takes a double argument: - Constructor ctor = tc.getConstructor( - new Class[] {double.class}); + Constructor ctor = trashType.getConstructor( + double.class); // Call the constructor to create a // new object: - return (Trash)ctor.newInstance( - new Object[]{info.data}); + return (T)ctor.newInstance(info.data); } catch(NoSuchMethodException | SecurityException | InstantiationException | diff --git a/patterns/trashvisitor/TrashVisitor.java b/patterns/trashvisitor/TrashVisitor.java index 1562d658..ce3f7b6c 100644 --- a/patterns/trashvisitor/TrashVisitor.java +++ b/patterns/trashvisitor/TrashVisitor.java @@ -80,16 +80,15 @@ class WeightVisitor implements Visitor { public class TrashVisitor { public static void main(String[] args) { - ArrayList bin = new ArrayList(); + ArrayList bin = new ArrayList<>(); // ParseTrash still works, without changes: ParseTrash.fillBin("VTrash.dat", bin); // You could even iterate through // a list of visitors! PriceVisitor pv = new PriceVisitor(); WeightVisitor wv = new WeightVisitor(); - Iterator it = bin.iterator(); - while(it.hasNext()) { - Visitable v = (Visitable)it.next(); + for(Trash aBin : bin) { + Visitable v = (Visitable) aBin; v.accept(pv); v.accept(wv); } diff --git a/patterns/trashvisitor/Visitable.java b/patterns/trashvisitor/Visitable.java index ff28c7a2..1ef7f8cb 100644 --- a/patterns/trashvisitor/Visitable.java +++ b/patterns/trashvisitor/Visitable.java @@ -3,7 +3,6 @@ // the Trash hierarchy without modifying the // base class. package patterns.trashvisitor; -import patterns.trash.*; interface Visitable { // The new method: diff --git a/patterns/trashvisitor/Visitor.java b/patterns/trashvisitor/Visitor.java index 5f915ff4..85f75375 100644 --- a/patterns/trashvisitor/Visitor.java +++ b/patterns/trashvisitor/Visitor.java @@ -1,7 +1,6 @@ //: patterns/trashvisitor/Visitor.java // The base interface for visitors. package patterns.trashvisitor; -import patterns.trash.*; interface Visitor { void visit(VAluminum a); diff --git a/patterns/visualobserver/BoxObserver.java b/patterns/visualobserver/BoxObserver.java index c733a4fb..aded5ff3 100644 --- a/patterns/visualobserver/BoxObserver.java +++ b/patterns/visualobserver/BoxObserver.java @@ -50,7 +50,7 @@ class OCBox extends JPanel implements Observer { Color.orange, Color.pink, Color.red, Color.white, Color.yellow }; - static final Color newColor() { + static Color newColor() { return colors[ (int)(Math.random() * colors.length) ]; @@ -83,7 +83,7 @@ class OCBox extends JPanel implements Observer { repaint(); } } - private final boolean nextTo(OCBox b) { + private boolean nextTo(OCBox b) { return Math.abs(x - b.x) <= 1 && Math.abs(y - b.y) <= 1; } diff --git a/staticchecking/drc/DogAndRobotCollections.java b/staticchecking/drc/DogAndRobotCollections.java index 32911fa7..3d94cc8e 100644 --- a/staticchecking/drc/DogAndRobotCollections.java +++ b/staticchecking/drc/DogAndRobotCollections.java @@ -18,17 +18,17 @@ class Robot { public class DogAndRobotCollections { public static void main(String[] args) { - List dogList = new ArrayList(); - List robotList = new ArrayList(); + List dogList = new ArrayList<>(); + List robotList = new ArrayList<>(); for(int i = 0; i < 10; i++) dogList.add(new Dog()); // dogList.add(new Robot()); // Compile-time error for(int i = 0; i < 10; i++) robotList.add(new Robot()); // robotList.add(new Dog()); // Compile-time error - for(Dog d : dogList) - d.talk(); // No cast necessary - for(Robot r: robotList) - r.talk(); // No cast necessary + // No cast necessary + dogList.forEach(Dog::talk); + // No cast necessary + robotList.forEach(Robot::talk); } } ///:~ diff --git a/staticchecking/petspeak/PetSpeak.java b/staticchecking/petspeak/PetSpeak.java index 1cde5aa5..6004a733 100644 --- a/staticchecking/petspeak/PetSpeak.java +++ b/staticchecking/petspeak/PetSpeak.java @@ -22,7 +22,7 @@ public class PetSpeak { static void command(Pet p) { p.speak(); } public static void main(String[] args) { Pet[] pets = { new Cat(), new Dog() }; - for(int i = 0; i < pets.length; i++) - command(pets[i]); + for(Pet pet : pets) + command(pet); } } ///:~ diff --git a/swt/ColorBoxes.java b/swt/ColorBoxes.java index 08a75d89..2b2eab03 100644 --- a/swt/ColorBoxes.java +++ b/swt/ColorBoxes.java @@ -37,13 +37,10 @@ class CBox extends Canvas implements Runnable { try { while(!Thread.interrupted()) { cColor = newColor(); - getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - try { redraw(); } catch(SWTException e) {} - // SWTException is OK when the parent - // is terminated from under us. - } + getDisplay().asyncExec( () -> { + try { redraw(); } catch(SWTException e) {} + // SWTException is OK when the parent + // is terminated from under us. }); TimeUnit.MILLISECONDS.sleep(pause); } diff --git a/typeinfo/pets/ForNameCreator.java b/typeinfo/pets/ForNameCreator.java index f934fce9..4cf713e7 100644 --- a/typeinfo/pets/ForNameCreator.java +++ b/typeinfo/pets/ForNameCreator.java @@ -5,7 +5,7 @@ import java.util.*; public class ForNameCreator extends PetCreator { private static List> types = new ArrayList<>(); - // Types that you want to be randomly created: + // Types that you want randomly created: private static String[] typeNames = { "typeinfo.pets.Mutt", "typeinfo.pets.Pug",