자바 8에서 인터페이스 (Interface)에 디폴트 메소드와 정적 메소드가 추가되었다.


다음은 이를 테스트하는 예제 (Example)이다.


import org.junit.Test;


public class DefaultMethodTest {


    static interface InterfaceA {

        String getSomething();


        void useStatic();


        void useDefault();


        static void doSomethingInStatic() {

            System.out.println("Doing something...");

        }


        default void doSomethingInDefault() {

            System.out.println("Doing something with " + getSomething() + "...");

        }

    }


    static class ClassA implements InterfaceA {

        @Override

        public String getSomething() {

            return "something";

        }


        @Override

        public void useStatic() {

//            doSomethingInStatic();

            InterfaceA.doSomethingInStatic();

        }


        @Override

        public void useDefault() {

            doSomethingInDefault();

        }

    }


    @Test

    public void test() {

        ClassA a = new ClassA();

        InterfaceA.doSomethingInStatic();

//        a.doSomethingInStatic();

        a.doSomethingInDefault();


        a.useStatic();


        a.useDefault();

    }


}


정적 메소드는 인터페이스 이름으로만 접근할 수 있다.


인터페이스 타입의 객체를 통해서도 접근할 수 없다.


따라서 정적 메소드는 유틸리티 메소드에 적합하다.


객체 내에서 인터페이스 이름 없이 정의하고자 하는 메소드를 직접 사용하거나,


정의하고자 하는 메소드 내에서 객체를 참조한다면,


디폴트 메소드로 작성해야만 한다.


Reference:

http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

저작자 표시

Posted by izeye

다음은 Spring Boot Redis Sentinel 예제이다.


import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.CommandLineRunner;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.redis.RedisConnectionFailureException;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.data.redis.core.ValueOperations;

import redis.clients.jedis.exceptions.JedisConnectionException;


import java.util.concurrent.TimeUnit;


@Configuration

@EnableAutoConfiguration

public class Application implements CommandLineRunner {


    @Autowired

    private RedisTemplate<String, String> redisTemplate;


    @Override

    public void run(String... args) throws Exception {

        ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();

        valueOperations.set("foo", "bar", 5, TimeUnit.SECONDS);

        String value = valueOperations.get("foo");

        System.out.println(value);


        Thread.sleep(5000);


        value = valueOperations.get("foo");

        System.out.println(value);


        for (int i = 0; i < 100; i++) {

            try {

                valueOperations.set("foo" + i, "bar" + i);

                value = valueOperations.get("foo" + i);

                System.out.println(value);

            } catch (RedisConnectionFailureException e) {

                e.printStackTrace();

            }


            Thread.sleep(500);

        }


        for (int i = 0; i < 100; i++) {

            try {

                value = valueOperations.get("foo" + i);

                System.out.println(value);

            } catch (RedisConnectionFailureException e) {

                e.printStackTrace();

            }

        }

    }


    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);

    }


}


application.properties에 다음과 같이 Sentinel 설정을 추가한다.


spring.redis.sentinel.master=mymaster

spring.redis.sentinel.nodes=127.0.0.1:20000,127.0.0.1:20001,127.0.0.1:20002


Sentinel은 spring-boot-starter-redis 1.2 버전부터 제공된다.


현재 릴리즈 (Release) 버전은 1.1.8.RELEASE이고,


안타깝지만 이 기능을 위해서는 milestone 버전인 1.2.0.M2을 사용해야만 한다.


References:

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/common-application-properties.html

https://github.com/spring-projects/spring-boot/issues/1626

저작자 표시

Posted by izeye


티스토리 툴바