package org.ObjectLayout.examples;/* * Written by Gil Tene and Martin Thompson, and released to the public domain, * as explained at http://creativecommons.org/publicdomain/zero/1.0/ */ import org.ObjectLayout.ConstructionContext; import org.ObjectLayout.CtorAndArgs; import org.ObjectLayout.CtorAndArgsProvider; import org.ObjectLayout.StructuredArray; import java.lang.reflect.Constructor; public class PointArray extends StructuredArray<Point> { // expose copy constructor: public PointArray(PointArray source) { super(source); } // Default constructor needs to be defined only because we wanted to expose a copy constructor public PointArray() { } // newInstance wrapper for convenience (cleaner/fewer parameters for API user): public static PointArray newInstance(final long length) { return StructuredArray.newInstance(PointArray.class, Point.class, length); } // newInstance wrapper for convenience (cleaner/fewer parameters for API user): public static PointArray newInstance(final long length, final CtorAndArgsProvider<Point> ctorAndArgsProvider) { return StructuredArray.newInstance( PointArray.class, Point.class, length, ctorAndArgsProvider); } // If you want to support direct construction parameters for elements, with with // parameter types you know (statically) have a good constructor associated with the, // here is an example: public static PointArray newInstance(final long length, final long x, final long y) { final CtorAndArgs<Point> xy_ctorAndArgs = new CtorAndArgs<Point>(xy_constructor, x, y); return StructuredArray.newInstance( PointArray.class, Point.class, length, // This can be a Lambda expression in Java 8: new CtorAndArgsProvider<Point>() { @Override public CtorAndArgs<Point> getForContext( ConstructionContext<Point> context) throws NoSuchMethodException { return xy_ctorAndArgs; } }); } static final Constructor<Point> xy_constructor; static { try { @SuppressWarnings("unchecked") Constructor<Point> constructor = Point.class.getConstructor(long.class, long.class); xy_constructor = constructor; } catch (NoSuchMethodException ex) { throw new RuntimeException(ex); } } }