package mariaJava;

import java.util.ArrayList;
import java.util.List;

public class FinalExperiments {

	public void blandat() {

		listExperiments();
//		constructorExperiments();
	}

	private void listExperiments() {
		List<Integer> list = new ArrayList<>();
		list.add(5);
		list.add(1);
		list.add(6);
		
		System.out.println("Normal list: " + list);
		modifyingList(list);
		System.out.println("list is now " +list);
		
		modifyingListDespiteFinal(list);
		System.out.println("list is now " + list);
		
		list = reassigningList(list);
		System.out.println("List is reassigned to " + list);
		
		final List<Integer> finalList = new ArrayList<>();
		finalList.add(4);
		finalList.add(5);
		
		System.out.println("A final list: " +finalList);
		
		modifyingList(finalList);
		System.out.println(finalList);
		
		modifyingListDespiteFinal(finalList);
		System.out.println(finalList);
		
//		finalList = reassigningList(finalList); //Compiler error!
		System.out.println("This final list could not be reassigned in an other method! Compiler error!");
		
		Object[] listArray = finalList.toArray();
		System.out.println("lista to Array: " + listArray[0]  + " ," + listArray[1] + " ," + listArray[2]  + " ," + listArray[3]);
		
		Integer[] integerArray = {10,1,21};
		System.out.println("Array: " + integerArray[0] + " " + integerArray[1] + " " + integerArray[2]);
	}

	private void modifyingListDespiteFinal(final List<Integer> list) {
		System.out.println("Side-effect: Modifying content of list despite final parameter");
		list.add(4);
	}

	private void modifyingList(List<Integer> lista) {
		System.out.println("Side-effect: Modifying list");
		lista.add(3);
	}

	private List<Integer> reassigningList(List<Integer> list) {
		System.out.println("Reassigning list to something else");
		List<Integer> newList = new ArrayList<>();
		newList.add(12);
		return newList;
		
	}
	
	private void constructorExperiments() {
		Fruit apple = new Fruit("red", 120);
		
		int weight = 10;
		Fruit orange = new Fruit("orange", weight, "Orange");
		System.out.println("Orange weight1 is still "+ weight);
		int w1 = orange.getWeight();
		System.out.println("w1: " + w1);
		w1 = w1+2;
		System.out.println("w1+2: " + w1);
		System.out.println("Orange weight1 is not affected: " + orange.getWeight());
		
		int w2 = orange.getWeight2();
		System.out.println("Orange weight2 is w2: " + w2);
		w2 = w2+4;
		System.out.println("w2+4: " + w2);
		System.out.println("Organge weight2 is not affected: " + orange.getWeight2());
	}
}
