💡

プログラミング自主学習 DAY52 Interface/Coding Test

2023/07/17に公開

Interface

default method

抽象クラス以外も、インスタンス生成時に活用できるdefault methodがある。
setMuteというdefaultメソッドがあると仮定する。

RemoteControl

public interface RemoteControl {
	
	int MAX_VOLUME = 10;
	int MIN_VOLUME = 0;
	
	
	void turnOn();
	void turnOff();
	void setVolume(int volume);
	
	//default method
	default void setMute(boolean mute) {
		if(mute) {
		 System.out.println("muteします。");
		 setVolume(MIN_VOLUME);
	   }else {
		System.out.println("muteを解除します。");
       }
    }//method block

RemoteControlExample

public class RemoteControlExample {
	public static void main(String[] args) {
            
	    RemoteControl rc;
		
	    rc = new Television();
	    rc.turnOn();
	    rc.setVolume(5);
		
	    rc.setMute(true);
	    rc.setMute(false);
	}
}

<result> 
muteします。
現在のTVヴォリューム:0
muteを解除します。

Audio
private int memoryVolume;

@Override
public void setMute(boolean mute){
  if(mute) {
  this.memoryVolume = this.volume;
  System.out.println("muteします。");
  setVolume(RemoteControl.MIN_VOLUME);
  
  }else {
  System.out.println("muteを解除します。");
  setVolume(this.memoryVolume);
}

static method

static void changeBattery(){
 System.out.println("電池を交換します。")
}

private method

abstarct methoddefault methodstatic methodは、基本的にpublicのアクセス接近修飾子を持っている。
例えば、default method a()とb()が100以上の長いコードで、一行目のみ違うメソッドだとする。その場合、重なるコードが多いため、無駄が多くなるが、その際にprivate methodに重複コードを移すことができる。
コンストラクタの場合、this(parameter);を使用して、無駄なコードを減らすことがあったが、似ている原理だ。

InterfaceService

public interface Service {
	
	//default method 
		default void defaultMethod1() {
			System.out.println("defaultMethod1");
			defaultCommon();
		}
		
		default void defaultMethod2() {
			System.out.println("defaultMethod2");
			defaultCommon();
		}
		
	//private method
		private void defaultCommon() {
			System.out.println("defaultMethod1SameCode");
			System.out.println("defaultMethod2SameCode");
		}
		
	//default method 
		static void defaultStaticMethod1() {
			System.out.println("defaultStaticMethod1");
			defaultStaticCommon();
		}
		
		static void defaultStaticMethod2() {
			System.out.println("defaultStaticMethod2");
			defaultStaticCommon();
		}
		
	//private method
		private static void defaultStaticCommon() {
			System.out.println("defaultStaticMethod1SameCode");
			System.out.println("defaultStaticMethod2SameCode");
		}
}

ServiceImp
public class ServiceIml implements Service{
}
ServiceExample
public class ServiceExample {
	public static void main(String[] args) {
		//declare interface variable and input object address
		Service service = new ServiceIml();
		
		//call default method 
		service.defaultMethod1();
		System.out.println();
		service.defaultMethod2();
		System.out.println();
		
		//call static method
		Service.defaultStaticMethod1();
		System.out.println();
		Service.defaultStaticMethod2();
		System.out.println();
		
	}

}
defaultMethod1
defaultMethod1SameCode
defaultMethod2SameCode

defaultMethod2
defaultMethod1SameCode
defaultMethod2SameCode

defaultStaticMethod1
defaultStaticMethod1SameCode
defaultStaticMethod2SameCode

defaultStaticMethod2
defaultStaticMethod1SameCode
defaultStaticMethod2SameCode


Coding Test

接頭辞:String.startWith();

startWith
String banana = "banana";  

String ba = "ba"; 
String an = "an";
String bananas ="bananas";

System.out.println(banana.startWith(ba));
System.out.println(banana.startWith(an));
System.out.println(banana.startWith(bananas));
true
false
false

配列の要素ほど追加

Array
class Solution {
    public int[] solution(int[] arr) {
        int size = 0;
        for(int a: arr){size += a;}
        int[] answer = new int[size];
        int count = 0;  
        
        for(int i=0; i< arr.length; i++){      
           for(int j=0; j<arr[i]; j++){    
            answer[count] = arr[i];
            count++;   
           }  
        }
   
        return answer;
    }
}


配列を昇順/降順にする

Discussion