package org.mutabilitydetector.benchmarks.settermethod.singlecheck; /* * #%L * MutabilityDetector * %% * Copyright (C) 2008 - 2014 Graham Allan * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ /** * Subject classes for testing. They do not use aliases for instance variables * in lazy method. * * @author Juergen Fickel (jufickel@htwg-konstanz.de) * @version 27.02.2013 */ public final class WithoutAlias { /** * The lazy variables have the default value which is assigned by JVM * appropriately to their type. */ public static final class WithJvmInitialValue { public static final class Stateless { public static int sum(final int firstAddend, final int secondAddend) { return firstAddend + secondAddend; } } // class Stateless public static final class BooleanFlag { public static final String CLASS_NAME = "BooleanStandardIdiom"; private volatile boolean flag = false; public void printClassNameAtMostOneTime() { synchronized (this) { if (!flag) { printClassName(); flag = true; } } } private void printClassName() { System.out.println(CLASS_NAME); } } // class BooleanFlag public static final class BooleanFlagWithFalseAssignmentGuard { public static final String CLASS_NAME = "BooleanStandardIdiom"; private volatile boolean flag = false; public void printClassNameAtMostOneTime() { synchronized (this) { if (flag) { printClassName(); flag = true; } } } private void printClassName() { System.out.println(CLASS_NAME); } } // class BooleanFlag public static final class CharValid { private char hash; public char hashCodeChar() { if (0 == hash) { hash = 'a'; } return hash; } } // class CharValid public static final class CharInvalid { private char hash; public char hashCodeChar() { if ("".equals(hash)) { hash = 'a'; } return hash; } } // class CharInvalid public static final class CharInvalid2 { @SuppressWarnings("unused") private boolean initialised; private char hash; public CharInvalid2() { initialised = false; } public char hashCodeChar() { if ("".equals(hash)) { hash = 'a'; } return hash; } } // class CharInvalid public static final class FloatValid { private float hash; public float hashCodeFloat() { if (0.0F == hash) { hash = 2342.0F / 23; } return hash; } } // class FloatValid public static final class FloatInvalid { private float hash; public float hashCodeFloat() { if (0.0001F == hash) { hash = 2342.0F; } return hash; } } // class FloatInvalid public static final class IntegerValid { private int hash; @Override public int hashCode() { if (0 == hash) { hash = 2342; } return hash; } } // class IntegerValid public static final class IntegerInvalid { private int hash; @Override public int hashCode() { if (-1 == hash) { hash = 2342; } return hash; } } // class IntegerInvalid public static final class IntegerWithInvalidValueCalculationMethod { private int hash; @Override public int hashCode() { if (0 == hash) { hash = calculateValue(2342); } return hash; } public int calculateValue(final int input) { return input; } } // class IntegerInvalid public static final class ObjectValid { private Object hash = null; public Object hashCodeObject() { if (null == hash) { hash = createInstance(); } return hash; } private static Object createInstance() { return new Object(); } } // class ObjectValid public static final class ObjectInvalid { private final Object comparativeObject = new Object(); private Object hash = null; public Object hashCodeObject() { if (comparativeObject.equals(hash)) { hash = new Object(); } return hash; } } // class ObjectInvalid public static final class SynchronizedObjectValid { private Object complexObject; public synchronized Object getComplexObject() { if (null == complexObject) { complexObject = new Object(); } return complexObject; } } // class SynchronizedObjectValid public static final class StringValid { private String hash; public String hashCodeString() { if (null == hash) { hash = "Hash code"; } return hash; } } // class StringValid public static final class StringWithInvalidValueCalculationMethod { public String mutable; private String hash; public String hashCodeString() { if (null == hash) { hash = getValue(mutable); } return hash; } private String getValue(final String input) { return input; } } // class StringValid public static final class StringStaticValid { private static String hash; public String hashCodeString() { if (null == hash) { hash = "Hash code"; } return hash; } } // class StringStaticValid public static final class StringInvalid { private String hash; public String hashCodeString() { hash = "Hash code"; return hash; } } // class StringInvalid public static final class CustomObjectInvalid { public static final class SomeObject { private SomeObject() { super(); } public static SomeObject getInstance() { return new SomeObject(); } } private SomeObject someObject; public SomeObject hashCodeSomeObject() { if (someObject == null) { someObject = SomeObject.getInstance(); } return someObject; } } // class CustomObjectInvalid } // class WithJvmInitialValue /** * After object construction a custom value will have been assigned to the * lazy variables. */ public static final class WithCustomInitialValue { public static final class IntegerValid { private int hash = -1; @Override public int hashCode() { if (-1 == hash) { hash = 2342; } return hash; } } // class IntegerValid public static final class IntegerInvalid { private int hash = -1; public IntegerInvalid() { hash = -2; } @Override public int hashCode() { if (0 == hash) { hash = 2342; } return hash; } } // class IntegerInvalid public static final class IntegerWithNonCandidateVariable { private int hash = -1; @SuppressWarnings("unused") private int useless = Integer.MAX_VALUE; public IntegerWithNonCandidateVariable() { hash = -2; } @Override public int hashCode() { if (-2 == hash) { hash = 2342; } return hash; } } // class IntegerWithNonCandidateVariable public static final class FloatValid { private float hash = -1.0F; public float hashCodeFloat() { if (-1.0F == hash) { hash = 2342.0F; } return hash; } } // class FloatValid public static final class FloatInvalid { private float hash = -1.0F; public float hashCodeFloat() { if (-1.0F == hash) { hash = 2342.0F; } return hash; } public void setHash(final float newValue) { hash = newValue; } } // class FloatInvalid public static final class FloatInvalidWithMultipleInitialValues { private float hash = 0.0F; public FloatInvalidWithMultipleInitialValues() { hash = -1.0F; } public FloatInvalidWithMultipleInitialValues(final float initial) { hash = initial; } public FloatInvalidWithMultipleInitialValues(final String foo) { hash = 23.0F; } public float hashCodeFloat() { if (0.0F == hash) { hash = 2342.0F; } return hash; } } // class FloatValidWithMultipleInitialValues public static final class ObjectInvalidWithMultipleInitialValues { private static Object obj; public ObjectInvalidWithMultipleInitialValues() { obj = new Object(); } public ObjectInvalidWithMultipleInitialValues(final int foo) { obj = Integer.valueOf(foo); } public ObjectInvalidWithMultipleInitialValues(final String bar) { obj = new String(bar); } public static Object getObject() { if (null == obj) { obj = new Object(); } return obj; } } // class ObjectInvalidWithMultipleInitialValues public static final class ObjectInvalidWithMultipleInitialValues2 { private static Object obj; public ObjectInvalidWithMultipleInitialValues2() { obj = null; } public ObjectInvalidWithMultipleInitialValues2(final String bar) { obj = new String(bar); } public static Object getObject() { if (null == obj) { obj = new Object(); } return obj; } } // class ObjectInvalidWithMultipleInitialValues2 public static final class StringValid { private String hash = ""; public String hashCodeString() { if ("".equals(hash)) { hash = "Hash code"; } return hash; } } // class StringValid public static final class StringValid2 { { hash = ""; } private String hash; public String hashCodeString() { if ("".equals(hash)) { hash = "Hash code"; } return hash; } } // class StringValid2 public static final class StringInvalid { private String hash = "abc"; public String hashCodeString() { if ("".equals(hash) && 3 == hash.length()) { hash = "Hash code"; } return hash; } } // class StringInvalid public static final class StringInvalid2 { private String hash = new String(); public String hashCodeString() { if (null == hash) { hash = "Hash code"; } return hash; } } // class StringInvalid } // class WithCustomInitialValue }