20190523のJavaに関する記事は16件です。

EclipseでSpring Boot使用時にpom.xmlのline 1にUnknown error

現象

イマイチ説明が難しいのだが、Eclipseでspring-boot使用時に以下のようなエラーが出る。

booterror.jpg

だいたいこんな感じのpom.xml。

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>kagamihoge</groupId>
    <artifactId>springintegratesample</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>springintegratesample</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>11</java.version>
    </properties>

</project>

対策

当座動けばいいというだけなら、2.1.52.1.4にする。

またはプロパティに以下を追加する。

<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>

参考URL

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java初学者】コレクション 型指定なし printlnメソッド

疑問

最近コレクションを学習し、疑問に感じた点があったため、記事に起こしながら確認します。

コレクション

Listを使うときに型引数を指定しない場合、格納された時点でObject型として処理される。

理解できなかった謎処理

ListにString型変数入れたけど、Listを型指定してないからObject型になって、そのオブジェクトの文字列をprintlnで表示...?

printlnの処理

printlnの引数に入れられたオブジェクトのvalueOfメソッドを呼び出して文字列を表示する。
<修正 2019/05/24>
println()の引数をStringクラスのstaticメソッドvalueOf()の引数に与え処理が行われる。

toStringとvalueOfの違い

toStringメソッドはインスタンスの文字列を返す。
valueOfメソッドは引数で渡されたオブジェクトがnullでなければ、そのオブジェクトのtoStringメソッドを呼びだす。

結局toString

valueOfも結局はそのオブジェクトの文字列を返している。

User.java
public class User{
    private String name;
    public User(String name){
         this.name = name;
    }
    public String toString(){
         return name;
    }
}
Main.java
public class Main{
   public static void main(String[] args){
      ArrayList list = new ArrayList();
      list.add(new User("sample"));
      System.out.println(list.get(0)); //sample
   }
}

結果

型安全、Overrideをより理解できた。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

method.invokeについて

動的にメソッドを呼び出して使うという機会はなかったのですが、ソースコードでたまたま見かけることが気になったので実践。

確認のためクラスを作成して試してみました。
ここではInvokeクラスで、Getmethodクラスのメソッド名を受け取り、動的に呼び出しています。
もっと工夫したら色々できそうですが、まずは手を動かして身体に覚えさせる目的でいます。

class Getmethod {
    public void a(){
        System.out.println("Aを呼び出しました");
    }
    public void b(String str){
        System.out.println(str + "を呼び出しました");
    }

    public void c(String str,String str2){
        System.out.println(str + "と" + str2 + "を呼び出しました");
    }
}
public class Invoke {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {

    try {
        // クラスの取得
        Class<?> g = Class.forName("invoke.Getmethod");
        // インスタンスの取得
        Object myobj = g.newInstance();
        // メソッドの取得
        Method a = g.getMethod("a");
        Method b = g.getMethod("b",String.class);
        Method c = g.getMethod("c",String.class,String.class);
        // メソッドの実行
        a.invoke(myobj);
        b.invoke(myobj,"b");
        c.invoke(myobj,"c","d");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    }
}

下が実行結果です。

Aを呼び出しました
bを呼び出しました
cとdを呼び出しました

使い方についてこんな使い方があるよなどあれば編集リクエストでお待ちしております。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ABC - 015 - A&B&C

AtCoder ABC 015 A&B&C

AtCoder - 015

A - 高橋くんの研修

  • 変数名って会社毎に独特のルールあるよね
    private void solveA() {
        String a = next();
        String b = next();

        out.println(a.length() > b.length() ? a : b);
    }

B - 高橋くんの集計

  • 0ではない数を数えて母数とする
  • 少数は切り上げ
    private void solveB() {
        int n = nextInt();
        double base = 0;
        double total = 0;
        for (int i = 0; i < n; i++) {
            int wk = nextInt();
            if (wk != 0) {
                base++;
                total += wk;
            }
        }

        out.println((int) Math.ceil(total / base));
    }

C - 高橋くんのバグ探し

  • 結構典型的なDFSでした
private void solveC() {
        int n = nextInt();
        int k = nextInt();

        int[][] wk = IntStream.range(0, n).collect(() -> new int[n][k],
                (t, i) -> {
                    for (int j = 0; j < k; j++) {
                        t[i][j] = nextInt();
                    }
                },
                (t, u) -> {
                    Stream.concat(Arrays.stream(t), Arrays.stream(u));
                });

        out.println(recursiveC(wk, 0, 0) ? "Found" : "Nothing");
    }

    private boolean recursiveC(int[][] wk, int currentI, int currenXor) {

        /*
         * 最後の質問までいったので、今までのXORの結果を確認する
         */
        if (currentI >= wk.length) {
            return currenXor == 0;
        }
        boolean res = false;
        /*
         * currentI番目の質問のi番目の選択を選んだ場合のXORを確認していく
         */
        for (int i = 0; i < wk[currentI].length; i++) {
            res = res || recursiveC(wk, currentI + 1, currenXor ^ wk[currentI][i]);
        }

        return res;
    }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java Network 基礎[自分用MEMO]

Socketについて

Socketはサーバやクライアントと通信をとりもつ窓口にあたる。
ソケット通信をする上でServerSocketとSocketを使います。
ServerSocketのパッケージ情報: https://docs.oracle.com/javase/jp/7/api/java/net/ServerSocket.html
Socketのパッケージ情報: https://docs.oracle.com/javase/jp/7/api/java/net/Socket.html

ServerSocket 変数名 = new ServerSocket(port番号);
Socket 変数名 = new Socket();

これらを定義し通信を行います。


Socket通信方法

簡単な通信を行うには

  • ServerSocketのインスタンスを作成
  • Socketの通信接続
  • 通信開始

を基本操作とします。

以下は通信する上でのサンプルコードです。


これから書く。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Desktop : OpenCV Sobel Filter2

Goal

Test OpenCV sobel filter.

OpenCV_Sobel_Filter2.java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.image.BufferedImage;

public class OpenCV_Sobel_Filter2 {

    static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}
    private JFrame frmjavaSwing;

    /**
        * Launch the application.
        */
    public static void main(String[] argv){
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try{
                    OpenCV_Sobel_Filter2 window = new OpenCV_Sobel_Filter2();
                    window.frmjavaSwing.setVisible(true);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        });
    }

    /**
        * Create the application.
        */
    public OpenCV_Sobel_Filter2(){
        init();
    }

    /**
        * Init the contents of the frame.
        */
    private void init(){
        final Mat src = Imgcodecs.imread(
                "D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\lena.jpg");
        BufferedImage image = matToBufferedImage(src);

        frmjavaSwing = new JFrame();
        frmjavaSwing.setTitle("opencv Sobel API½m²ß1");
        frmjavaSwing.setBounds(100, 100, 560, 620);
        frmjavaSwing.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmjavaSwing.getContentPane().setLayout(null);

        final JLabel lblNewLabel = new JLabel("");
        lblNewLabel.setBounds(5, 60, image.getHeight()+10, image.getWidth()+10);
        lblNewLabel.setIcon(new ImageIcon(image));
        frmjavaSwing.getContentPane().add(lblNewLabel);

        JLabel lblKsize = new JLabel("dx");
        lblKsize.setBounds(10, 10, 46, 15);
        frmjavaSwing.getContentPane().add(lblKsize);

        final JSlider slider_dx = new JSlider();
        slider_dx.setMaximum(2);

        slider_dx.setValue(1);
        slider_dx.setBounds(50, 0, 200, 25);
        frmjavaSwing.getContentPane().add(slider_dx);

        final JLabel lblKsize_Val = new JLabel("1");
        lblKsize_Val.setBounds(253, 10, 46, 15);
        frmjavaSwing.getContentPane().add(lblKsize_Val);

        JLabel lblScale = new JLabel(" dy");
        lblScale.setBounds(5, 35, 27, 15);
        frmjavaSwing.getContentPane().add(lblScale);

        final JSlider slider_dy = new JSlider();
        slider_dy.setMaximum(2);

        slider_dy.setValue(1);
        slider_dy.setBounds(50, 35, 200, 25);
        frmjavaSwing.getContentPane().add(slider_dy);

        final JLabel lblScale_Val = new JLabel("1");
        lblScale_Val.setBounds(253, 35, 46, 15);
        frmjavaSwing.getContentPane().add(lblScale_Val);

        slider_dx.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent arg0) {

                lblKsize_Val.setText(slider_dx.getValue()+"");
                BufferedImage newImage=matToBufferedImage(Sobel(src,slider_dx.getValue(),slider_dy.getValue()));
                lblNewLabel.setIcon(new ImageIcon(newImage));
            }
        });

        slider_dy.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent arg0) {
                lblScale_Val.setText(slider_dy.getValue()+"");
                BufferedImage newImage=matToBufferedImage(Sobel(src,slider_dx.getValue(),slider_dy.getValue()));
                lblNewLabel.setIcon(new ImageIcon(newImage));

            }
        });
    }
    public Mat Sobel(Mat source,int dx,int dy){
        Mat destination=new Mat(source.rows(),source.cols(),source.type());
        if((dx==0)&&(dy==0)){
            dx=1;
        }
        Imgproc.Sobel(source, destination, -1,dx,dy);
        return destination;

    }

    public BufferedImage matToBufferedImage(Mat matrix) {
        int cols = matrix.cols();
        int rows = matrix.rows();
        int elemSize = (int)matrix.elemSize();
        byte[] data = new byte[cols * rows * elemSize];
        int type;
        matrix.get(0, 0, data);
        switch (matrix.channels()) {
            case 1:
                type = BufferedImage.TYPE_BYTE_GRAY;
                break;
            case 3:
                type = BufferedImage.TYPE_3BYTE_BGR;
                // bgr to rgb
                byte b;
                for(int i=0; i<data.length; i=i+3) {
                    b = data[i];
                    data[i] = data[i+2];
                    data[i+2] = b;
                }
                break;
            default:
                return null;
        }
        BufferedImage image2 = new BufferedImage(cols, rows, type);
        image2.getRaster().setDataElements(0, 0, cols, rows, data);
        return image2;
    }
}
Result

opencv_sobel_filter2.JPG

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Desktop : OpenCV Sobel Filter

Goal

Test OpenCV sobel filter.

OpenCV_Sobel_Filter.java
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

public class OpenCV_Sobel_Filter {
    static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}
    private JFrame frmjavaSwing;

    /**
        * Launch the application.
        */
    public static void main(String[] argv){
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try{
                    OpenCV_Sobel_Filter window = new OpenCV_Sobel_Filter();
                    window.frmjavaSwing.setVisible(true);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        });
    }

    /**
        *   Create the application.
        */
    public OpenCV_Sobel_Filter(){
        init();
    }

    /**
        * Init the contents of the frame.
        */
    private void init(){
        final Mat src = Imgcodecs.imread(
                "D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\lena.jpg");

        BufferedImage image=matToBufferedImage(src);

        frmjavaSwing = new JFrame();
        frmjavaSwing.setTitle("opencv Sobel Filter練習");
        frmjavaSwing.setBounds(100, 100, 560, 620);
        frmjavaSwing.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmjavaSwing.getContentPane().setLayout(null);

        final JLabel lblNewLabel = new JLabel("");
        lblNewLabel.setBounds(5, 60, image.getHeight()+10, image.getWidth()+10);
        lblNewLabel.setIcon(new ImageIcon(image));
        frmjavaSwing.getContentPane().add(lblNewLabel);

        JButton btnX = new JButton("水平方向(x)");
        btnX.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                BufferedImage newImage=matToBufferedImage(Convolution(src,2));
                lblNewLabel.setIcon(new ImageIcon(newImage));
            }
        });
        btnX.setBounds(42, 10, 114, 23);
        frmjavaSwing.getContentPane().add(btnX);

        JButton btnY = new JButton("垂直方向(y)");
        btnY.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                BufferedImage newImage=matToBufferedImage(Convolution(src,1));
                lblNewLabel.setIcon(new ImageIcon(newImage));
            }
        });
        btnY.setBounds(211, 10, 102, 23);
        frmjavaSwing.getContentPane().add(btnY);
    }

    public Mat Convolution(Mat source,int type){
        Mat kernel =new Mat(3,3, CvType.CV_32F);
        if (type==1){

            kernel.put(0, 0, new float[]{-1,0,1});
            kernel.put(1, 0, new float[]{-2,0,2});
            kernel.put(2, 0, new float[]{-1,0,1});

        }else if (type==2){

            kernel.put(0, 0, new float[]{-1,-2,-1});
            kernel.put(1, 0, new float[]{0,0,0});
            kernel.put(2, 0, new float[]{1,2,1});

        }
        Mat destination=new Mat(source.rows(),source.cols(),source.type());
        Imgproc.filter2D(source, destination, -1, kernel);
        return destination;

    }

    public BufferedImage matToBufferedImage(Mat matrix) {
        int cols = matrix.cols();
        int rows = matrix.rows();
        int elemSize = (int)matrix.elemSize();
        byte[] data = new byte[cols * rows * elemSize];
        int type;
        matrix.get(0, 0, data);
        switch (matrix.channels()) {
            case 1:
                type = BufferedImage.TYPE_BYTE_GRAY;
                break;
            case 3:
                type = BufferedImage.TYPE_3BYTE_BGR;
                // bgr to rgb
                byte b;
                for(int i=0; i<data.length; i=i+3) {
                    b = data[i];
                    data[i] = data[i+2];
                    data[i+2] = b;
                }
                break;
            default:
                return null;
        }
        BufferedImage image2 = new BufferedImage(cols, rows, type);
        image2.getRaster().setDataElements(0, 0, cols, rows, data);
        return image2;
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Desktop : OpenCV Laplacian Filter Final

Goal

Test OpenCV laplacian filter.

OpenCV_LaplacianFilter_Final.java
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

public class OpenCV_LaplacianFilter_Final {

    static{System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}
    private JFrame frmjavaSwing;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    OpenCV_LaplacianFilter_Final window = new OpenCV_LaplacianFilter_Final();
                    window.frmjavaSwing.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public OpenCV_LaplacianFilter_Final() {
        init();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void init() {
        final Mat source = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\lena.jpg");

        BufferedImage image=matToBufferedImage(source);

        frmjavaSwing = new JFrame();
        frmjavaSwing.setTitle("opencv Laplacian Filter練習");
        frmjavaSwing.setBounds(100, 100, 560, 620);
        frmjavaSwing.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmjavaSwing.getContentPane().setLayout(null);

        final JLabel lblNewLabel = new JLabel("");
        lblNewLabel.setBounds(5, 60, image.getHeight()+10, image.getWidth()+10);
        lblNewLabel.setIcon(new ImageIcon(image));
        frmjavaSwing.getContentPane().add(lblNewLabel);

        JButton btnX = new JButton("type1正片處理");
        btnX.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                BufferedImage newImage=matToBufferedImage(Convolution(source,1));
                lblNewLabel.setIcon(new ImageIcon(newImage));
            }
        });
        btnX.setBounds(24, 10, 140, 23);
        frmjavaSwing.getContentPane().add(btnX);

        JButton btnY = new JButton("負片處理");
        btnY.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                BufferedImage newImage=matToBufferedImage(Convolution(source,2));
                lblNewLabel.setIcon(new ImageIcon(newImage));
            }
        });
        btnY.setBounds(174, 10, 102, 23);
        frmjavaSwing.getContentPane().add(btnY);

        JButton btnType2 = new JButton("type2");
        btnType2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                BufferedImage newImage=matToBufferedImage(Convolution(source,3));
                lblNewLabel.setIcon(new ImageIcon(newImage));
            }
        });
        btnType2.setBounds(289, 10, 87, 23);
        frmjavaSwing.getContentPane().add(btnType2);

        JButton btnType3 = new JButton("type3");
        btnType3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                BufferedImage newImage=matToBufferedImage(Convolution(source,4));
                lblNewLabel.setIcon(new ImageIcon(newImage));
            }
        });
        btnType3.setBounds(396, 10, 87, 23);
        frmjavaSwing.getContentPane().add(btnType3);
    }

    public Mat Convolution(Mat source,int type){
        Mat kernel =new Mat(3,3, CvType.CV_32F);
        if (type==1){

            kernel.put(0, 0, new float[]{0,1,0});
            kernel.put(1, 0, new float[]{1,-4,1});
            kernel.put(2, 0, new float[]{0,1,0});

        }else if (type==2){

            kernel.put(0, 0, new float[]{0,-1,0});
            kernel.put(1, 0, new float[]{-1,4,-1});
            kernel.put(2, 0, new float[]{0,-1,0});



        }else if (type==3){

            kernel.put(0, 0, new float[]{1,1,1});
            kernel.put(1, 0, new float[]{1,-8,1});
            kernel.put(2, 0, new float[]{1,1,1});


        }else if (type==4){
            kernel.put(0, 0, new float[]{-1,2,-1});
            kernel.put(1, 0, new float[]{2,-4,2});
            kernel.put(2, 0, new float[]{-1,2,-1});


        }
        Mat destination=new Mat(source.rows(),source.cols(),source.type());
        Imgproc.filter2D(source, destination, -1, kernel);
        return destination;

    }

    public BufferedImage matToBufferedImage(Mat matrix) {
        int cols = matrix.cols();
        int rows = matrix.rows();
        int elemSize = (int)matrix.elemSize();
        byte[] data = new byte[cols * rows * elemSize];
        int type;
        matrix.get(0, 0, data);
        switch (matrix.channels()) {
            case 1:
                type = BufferedImage.TYPE_BYTE_GRAY;
                break;
            case 3:
                type = BufferedImage.TYPE_3BYTE_BGR;
                // bgr to rgb
                byte b;
                for(int i=0; i<data.length; i=i+3) {
                    b = data[i];
                    data[i] = data[i+2];
                    data[i+2] = b;
                }
                break;
            default:
                return null;
        }
        BufferedImage image2 = new BufferedImage(cols, rows, type);
        image2.getRaster().setDataElements(0, 0, cols, rows, data);
        return image2;
    }
}
Result

opencv_laplacian_filter_final.JPG

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Desktop : OpenCV Laplacian Filter GrayScale

Goal

Test OpenCV Laplacian Filter with a GrayScale image.

OpenCV_Laplacian_Filter_GrayScale.java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.image.BufferedImage;

public class OpenCV_Laplacian_Filter_GrayScale {

    static{System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}
    private JFrame frmjavaSwing;

    /**
        *  Launch the application.
        */
    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try{
                    OpenCV_Laplacian_Filter_GrayScale window = new OpenCV_Laplacian_Filter_GrayScale();
                    window.frmjavaSwing.setVisible(true);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     *  Create the application.
     */
    public OpenCV_Laplacian_Filter_GrayScale() {
        init();
    }
    private void init() {
        final Mat src = Imgcodecs.imread(
                "D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\lena.jpg");
        final Mat temp = new Mat(src.rows(), src.cols(), src.type());
        Imgproc.cvtColor(src, temp, Imgproc.COLOR_RGB2GRAY);
        BufferedImage image = matToBufferedImage(temp);

        frmjavaSwing = new JFrame();
        frmjavaSwing.setTitle("opencv Laplacian灰階影像練習");
        frmjavaSwing.setBounds(100, 100, 560, 620);
        frmjavaSwing.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmjavaSwing.getContentPane().setLayout(null);

        final JLabel lblNewLabel = new JLabel("");
        lblNewLabel.setBounds(5, 60, image.getHeight() + 10, image.getWidth() + 10);
        lblNewLabel.setIcon(new ImageIcon(image));
        frmjavaSwing.getContentPane().add(lblNewLabel);

        JLabel lblKsize = new JLabel("Ksize:");
        lblKsize.setBounds(10, 10, 46, 15);
        frmjavaSwing.getContentPane().add(lblKsize);

        final JSlider slider_Ksize = new JSlider();
        slider_Ksize.setMinimum(1);
        slider_Ksize.setMaximum(31);

        slider_Ksize.setValue(1);
        slider_Ksize.setBounds(50, 0, 200, 25);
        frmjavaSwing.getContentPane().add(slider_Ksize);

        final JLabel lblKsize_Val = new JLabel("1");
        lblKsize_Val.setBounds(253, 10, 46, 15);
        frmjavaSwing.getContentPane().add(lblKsize_Val);

        JLabel lblScale = new JLabel(" Scale:");
        lblScale.setBounds(5, 35, 42, 15);
        frmjavaSwing.getContentPane().add(lblScale);

        final JSlider slider_Scale = new JSlider();
        slider_Scale.setMinimum(1);

        slider_Scale.setValue(1);
        slider_Scale.setBounds(50, 35, 200, 25);
        frmjavaSwing.getContentPane().add(slider_Scale);

        final JLabel lblScale_Val = new JLabel("1");
        lblScale_Val.setBounds(253, 35, 46, 15);
        frmjavaSwing.getContentPane().add(lblScale_Val);

        JLabel lblNewLabel_1 = new JLabel("delta");
        lblNewLabel_1.setBounds(301, 10, 46, 15);
        frmjavaSwing.getContentPane().add(lblNewLabel_1);

        final JSlider slider_Delta = new JSlider();

        slider_Delta.setValue(0);
        slider_Delta.setBounds(283, 35, 180, 25);
        frmjavaSwing.getContentPane().add(slider_Delta);

        final JLabel lblDelta_Val = new JLabel("0");
        lblDelta_Val.setBounds(473, 35, 46, 15);
        frmjavaSwing.getContentPane().add(lblDelta_Val);

        slider_Ksize.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent arg0) {

                if (slider_Ksize.getValue() % 2 == 0) {
                    slider_Ksize.setValue(slider_Ksize.getValue() + 1);
                }
                lblKsize_Val.setText(slider_Ksize.getValue() + "");
                BufferedImage newImage = matToBufferedImage(Laplacian(temp, slider_Ksize.getValue(), slider_Scale.getValue(), slider_Delta.getValue()));
                lblNewLabel.setIcon(new ImageIcon(newImage));
            }
        });

        slider_Scale.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent arg0) {
                lblScale_Val.setText(slider_Scale.getValue() + "");
                BufferedImage newImage = matToBufferedImage(Laplacian(temp, slider_Ksize.getValue(), slider_Scale.getValue(), slider_Delta.getValue()));
                lblNewLabel.setIcon(new ImageIcon(newImage));

            }
        });

        slider_Delta.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent arg0) {
                lblDelta_Val.setText(slider_Delta.getValue() + "");
                BufferedImage newImage = matToBufferedImage(Laplacian(temp, slider_Ksize.getValue(), slider_Scale.getValue(), slider_Delta.getValue()));
                lblNewLabel.setIcon(new ImageIcon(newImage));
            }
        });
    }

    public Mat Laplacian(Mat source,int ksize,double scale,double delta){
        Mat destination=new Mat(source.rows(),source.cols(),source.type());
        Imgproc.Laplacian(source, destination, -1,ksize,scale,delta);
        return destination;

    }

    public BufferedImage matToBufferedImage(Mat matrix) {
        int cols = matrix.cols();
        int rows = matrix.rows();
        int elemSize = (int)matrix.elemSize();
        byte[] data = new byte[cols * rows * elemSize];
        int type;
        matrix.get(0, 0, data);
        switch (matrix.channels()) {
            case 1:
                type = BufferedImage.TYPE_BYTE_GRAY;
                break;
            case 3:
                type = BufferedImage.TYPE_3BYTE_BGR;
                // bgr to rgb
                byte b;
                for(int i=0; i<data.length; i=i+3) {
                    b = data[i];
                    data[i] = data[i+2];
                    data[i+2] = b;
                }
                break;
            default:
                return null;
        }
        BufferedImage image2 = new BufferedImage(cols, rows, type);
        image2.getRaster().setDataElements(0, 0, cols, rows, data);
        return image2;
    }
}
Result

opencv_laplacian_filter_gray_scale.JPG

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java】Stringクラス比較時の等価判定・等値判定の違いについてノート

Sting型変数に文字列の値を格納する時、書き方の違いによってString.equals==の間で判定結果が異なる。忘れないようにノート。

  • newを使う書き方
    • equals -> true
    • == -> false
  • 楽な書き方
    • equals -> true
    • == -> true

newを使う書き方

一般的にオブジェクト生成する時と同じ書き方

    String str = new String("文字列");

これで値を格納した変数同士を比較する。
果たして「格納」という言葉の使い方がこれで合ってるのだろうか?

Main.java
    // オブジェクトを生成
    String cat1 = new String("たま");
    String cat2 = new String("たま");

    // 等価判定と等値判定
    System.out.println(cat1.equals(cat2));
    System.out.println(cat1 == cat2);
出力結果.
true
false

楽な書き方

基本データ型に値を格納する時と同じ書き方

    String str = "文字列";

これで変数同士を比較する。

Main.java
    // 変数に値を格納
    String cat3 = "みけ";
    String cat4 = "みけ";

    // 等価判定と等値判定
    System.out.println(cat3.equals(cat4));
    System.out.println(cat3 == cat4);
出力結果.
true
true

つまるところ、==演算子を使って文字列同士を比較してしまうと、判定結果が異なってしまうので気をつけようということ。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java】Stringクラス比較時の等価判定・等値判定の判定違いについてノート

Sting型変数に文字列の値を格納する時、書き方の違いによってString.equals==の間で判定結果が異なる。忘れないようにノート。

  • newを使う書き方
    • equals -> true
    • == -> false
  • 楽な書き方
    • equals -> true
    • == -> true

newを使う書き方

一般的にオブジェクト生成する時と同じ書き方

    String str = new String("文字列");

これで値を格納した変数同士を比較する。
(果たして「格納」という言葉の使い方がこれで合ってるのだろうか?)

Main.java
    // オブジェクトを生成
    String cat1 = new String("たま");
    String cat2 = new String("たま");

    // 等価判定と等値判定
    System.out.println(cat1.equals(cat2));
    System.out.println(cat1 == cat2);
出力結果.
true
false

楽な書き方

基本データ型に値を格納する時と同じ書き方

    String str = "文字列";

これで変数同士を比較する。

Main.java
    // 変数に値を格納
    String cat3 = "みけ";
    String cat4 = "みけ";

    // 等価判定と等値判定
    System.out.println(cat3.equals(cat4));
    System.out.println(cat3 == cat4);
出力結果.
true
true

つまるところ、==演算子を使って文字列同士を比較してしまうと、判定結果が異なってしまうので気をつけようということ。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Desktop : OpenCV Laplacian Filter 2

Goal

Test OpenCV laplacian filter.

OpenCV_Laplacian_2.java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.image.BufferedImage;

public class OpenCV_Laplacian2 {

    static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}
    private JFrame frmjavaSwing;

    /**
        *   Launch the application.
        */
    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    OpenCV_Laplacian2 window = new OpenCV_Laplacian2();
                    window.frmjavaSwing.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
        * Create the application.
        */
    public OpenCV_Laplacian_2(){
        init();
    }

    private void init(){
        final Mat source = Imgcodecs.imread(
                "D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\baboon.jpg");

        BufferedImage image=matToBufferedImage(source);

        frmjavaSwing = new JFrame();
        frmjavaSwing.setTitle("opencv Laplacian API練習2");
        frmjavaSwing.setBounds(100, 100, 560, 620);
        frmjavaSwing.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmjavaSwing.getContentPane().setLayout(null);

        final JLabel lblNewLabel = new JLabel("");
        lblNewLabel.setBounds(5, 60, image.getHeight()+10, image.getWidth()+10);
        lblNewLabel.setIcon(new ImageIcon(image));
        frmjavaSwing.getContentPane().add(lblNewLabel);

        JLabel lblKsize = new JLabel("Ksize:");
        lblKsize.setBounds(10, 10, 46, 15);
        frmjavaSwing.getContentPane().add(lblKsize);

        final JSlider slider_Ksize = new JSlider();
        slider_Ksize.setMinimum(1);
        slider_Ksize.setMaximum(31);

        slider_Ksize.setValue(1);
        slider_Ksize.setBounds(50, 0, 200, 25);
        frmjavaSwing.getContentPane().add(slider_Ksize);

        final JLabel lblKsize_Val = new JLabel("1");
        lblKsize_Val.setBounds(253, 10, 46, 15);
        frmjavaSwing.getContentPane().add(lblKsize_Val);

        JLabel lblScale = new JLabel(" Scale:");
        lblScale.setBounds(5, 35, 42, 15);
        frmjavaSwing.getContentPane().add(lblScale);

        final JSlider slider_Scale = new JSlider();
        slider_Scale.setMinimum(1);

        slider_Scale.setValue(1);
        slider_Scale.setBounds(50, 35, 200, 25);
        frmjavaSwing.getContentPane().add(slider_Scale);

        final JLabel lblScale_Val = new JLabel("1");
        lblScale_Val.setBounds(253, 35, 46, 15);
        frmjavaSwing.getContentPane().add(lblScale_Val);

        JLabel lblNewLabel_1 = new JLabel("delta");
        lblNewLabel_1.setBounds(301, 10, 46, 15);
        frmjavaSwing.getContentPane().add(lblNewLabel_1);

        final JSlider slider_Delta = new JSlider();

        slider_Delta.setValue(0);
        slider_Delta.setBounds(283, 35, 180, 25);
        frmjavaSwing.getContentPane().add(slider_Delta);

        final JLabel lblDelta_Val = new JLabel("0");
        lblDelta_Val.setBounds(473, 35, 46, 15);
        frmjavaSwing.getContentPane().add(lblDelta_Val);

        slider_Ksize.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent arg0) {

                if(slider_Ksize.getValue()%2==0){
                    slider_Ksize.setValue(slider_Ksize.getValue()+1);
                }
                lblKsize_Val.setText(slider_Ksize.getValue()+"");
                BufferedImage newImage=matToBufferedImage(Laplacian(source,slider_Ksize.getValue(),slider_Scale.getValue(),slider_Delta.getValue()));
                lblNewLabel.setIcon(new ImageIcon(newImage));
            }
        });

        slider_Scale.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent arg0) {
                lblScale_Val.setText(slider_Scale.getValue()+"");
                BufferedImage newImage=matToBufferedImage(Laplacian(source,slider_Ksize.getValue(),slider_Scale.getValue(),slider_Delta.getValue()));
                lblNewLabel.setIcon(new ImageIcon(newImage));

            }
        });

        slider_Delta.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent arg0) {
                lblDelta_Val.setText(slider_Delta.getValue()+"");
                BufferedImage newImage=matToBufferedImage(Laplacian(source,slider_Ksize.getValue(),slider_Scale.getValue(),slider_Delta.getValue()));
                lblNewLabel.setIcon(new ImageIcon(newImage));
            }
        });
    }

    public Mat Laplacian(Mat source,int ksize,double scale,double delta){
        Mat destination=new Mat(source.rows(),source.cols(),source.type());
        Imgproc.Laplacian(source, destination, -1,ksize,scale,delta);
        return destination;

    }

    public BufferedImage matToBufferedImage(Mat matrix) {
        int cols = matrix.cols();
        int rows = matrix.rows();
        int elemSize = (int)matrix.elemSize();
        byte[] data = new byte[cols * rows * elemSize];
        int type;
        matrix.get(0, 0, data);
        switch (matrix.channels()) {
            case 1:
                type = BufferedImage.TYPE_BYTE_GRAY;
                break;
            case 3:
                type = BufferedImage.TYPE_3BYTE_BGR;
                // bgr to rgb
                byte b;
                for(int i=0; i<data.length; i=i+3) {
                    b = data[i];
                    data[i] = data[i+2];
                    data[i+2] = b;
                }
                break;
            default:
                return null;
        }
        BufferedImage image2 = new BufferedImage(cols, rows, type);
        image2.getRaster().setDataElements(0, 0, cols, rows, data);
        return image2;
    }
}
Result

opencv_laplacian_gray_scale.JPG

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Desktop : OpenCV Laplacian GrayScale

Goal

Test OpenCV laplacian filter.

OpenCV_Laplacian_GrayScale.java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.image.BufferedImage;

public class OpenCV_Laplacian_GrayScale {

    static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}
    private JFrame frmjavaSwing;

    /**
        *   Launch the application.
        */
    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    OpenCV_Laplacian_GrayScale window = new OpenCV_Laplacian_GrayScale();
                    window.frmjavaSwing.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
        * Create the application.
        */
    public OpenCV_Laplacian_GrayScale(){
        init();
    }

    private void init(){
        final Mat source = Imgcodecs.imread(
                "D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\baboon.jpg");

        BufferedImage image=matToBufferedImage(source);

        frmjavaSwing = new JFrame();
        frmjavaSwing.setTitle("opencv Laplacian API練習2");
        frmjavaSwing.setBounds(100, 100, 560, 620);
        frmjavaSwing.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmjavaSwing.getContentPane().setLayout(null);

        final JLabel lblNewLabel = new JLabel("");
        lblNewLabel.setBounds(5, 60, image.getHeight()+10, image.getWidth()+10);
        lblNewLabel.setIcon(new ImageIcon(image));
        frmjavaSwing.getContentPane().add(lblNewLabel);

        JLabel lblKsize = new JLabel("Ksize:");
        lblKsize.setBounds(10, 10, 46, 15);
        frmjavaSwing.getContentPane().add(lblKsize);

        final JSlider slider_Ksize = new JSlider();
        slider_Ksize.setMinimum(1);
        slider_Ksize.setMaximum(31);

        slider_Ksize.setValue(1);
        slider_Ksize.setBounds(50, 0, 200, 25);
        frmjavaSwing.getContentPane().add(slider_Ksize);

        final JLabel lblKsize_Val = new JLabel("1");
        lblKsize_Val.setBounds(253, 10, 46, 15);
        frmjavaSwing.getContentPane().add(lblKsize_Val);

        JLabel lblScale = new JLabel(" Scale:");
        lblScale.setBounds(5, 35, 42, 15);
        frmjavaSwing.getContentPane().add(lblScale);

        final JSlider slider_Scale = new JSlider();
        slider_Scale.setMinimum(1);

        slider_Scale.setValue(1);
        slider_Scale.setBounds(50, 35, 200, 25);
        frmjavaSwing.getContentPane().add(slider_Scale);

        final JLabel lblScale_Val = new JLabel("1");
        lblScale_Val.setBounds(253, 35, 46, 15);
        frmjavaSwing.getContentPane().add(lblScale_Val);

        JLabel lblNewLabel_1 = new JLabel("delta");
        lblNewLabel_1.setBounds(301, 10, 46, 15);
        frmjavaSwing.getContentPane().add(lblNewLabel_1);

        final JSlider slider_Delta = new JSlider();

        slider_Delta.setValue(0);
        slider_Delta.setBounds(283, 35, 180, 25);
        frmjavaSwing.getContentPane().add(slider_Delta);

        final JLabel lblDelta_Val = new JLabel("0");
        lblDelta_Val.setBounds(473, 35, 46, 15);
        frmjavaSwing.getContentPane().add(lblDelta_Val);

        slider_Ksize.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent arg0) {

                if(slider_Ksize.getValue()%2==0){
                    slider_Ksize.setValue(slider_Ksize.getValue()+1);
                }
                lblKsize_Val.setText(slider_Ksize.getValue()+"");
                BufferedImage newImage=matToBufferedImage(Laplacian(source,slider_Ksize.getValue(),slider_Scale.getValue(),slider_Delta.getValue()));
                lblNewLabel.setIcon(new ImageIcon(newImage));
            }
        });

        slider_Scale.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent arg0) {
                lblScale_Val.setText(slider_Scale.getValue()+"");
                BufferedImage newImage=matToBufferedImage(Laplacian(source,slider_Ksize.getValue(),slider_Scale.getValue(),slider_Delta.getValue()));
                lblNewLabel.setIcon(new ImageIcon(newImage));

            }
        });

        slider_Delta.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent arg0) {
                lblDelta_Val.setText(slider_Delta.getValue()+"");
                BufferedImage newImage=matToBufferedImage(Laplacian(source,slider_Ksize.getValue(),slider_Scale.getValue(),slider_Delta.getValue()));
                lblNewLabel.setIcon(new ImageIcon(newImage));
            }
        });
    }

    public Mat Laplacian(Mat source,int ksize,double scale,double delta){
        Mat destination=new Mat(source.rows(),source.cols(),source.type());
        Imgproc.Laplacian(source, destination, -1,ksize,scale,delta);
        return destination;

    }

    public BufferedImage matToBufferedImage(Mat matrix) {
        int cols = matrix.cols();
        int rows = matrix.rows();
        int elemSize = (int)matrix.elemSize();
        byte[] data = new byte[cols * rows * elemSize];
        int type;
        matrix.get(0, 0, data);
        switch (matrix.channels()) {
            case 1:
                type = BufferedImage.TYPE_BYTE_GRAY;
                break;
            case 3:
                type = BufferedImage.TYPE_3BYTE_BGR;
                // bgr to rgb
                byte b;
                for(int i=0; i<data.length; i=i+3) {
                    b = data[i];
                    data[i] = data[i+2];
                    data[i+2] = b;
                }
                break;
            default:
                return null;
        }
        BufferedImage image2 = new BufferedImage(cols, rows, type);
        image2.getRaster().setDataElements(0, 0, cols, rows, data);
        return image2;
    }


}
Result

opencv_laplacian_gray_scale.JPG

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

あなたのJavaコード品質を劇的に向上させる最も効果的で簡単な設定

変数に自動でfinalを付与するようにする。

Java > Editor > Save Actions で次の項目にチェックを入れる:

  • Perform the selected actions on save
  • Additional actions

Configure ボタンを押して次の画面へ。

saveaction1.png

Code Style タブで、 Variable declarations の中のチェックボックスに全てチェックをつける。

saveaction2.png

以上。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Javaの単体テスト時にログ出力の内容を検査する(モック未使用)

概要

単体テスト時にログ出力の内容を検査する(モック未使用)

環境

  • Java
  • slf4j 1.7.26
  • logback 1.2.3

方法説明

詳細な方法は サンプルコード を参照。

理屈としては、

  • テスト開始時にルートロガーに新しくAppenderを追加する
  • この時、追加するAppenderdoAppend()overrideし、引数として受け取るILoggingEventを外部スコープのListにadd()していく
  • テストしたい機能が終了した後、Listに入っているILoggingEventを検査する
  • 追加したAppenderをルートロガーからデタッチする

という流れ。

ルートロガーにAppenderを追加しっぱなしでデタッチしないと、以降のテスト全てのロギングを保持することになるので注意。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Javaデザインパターンまとめ

 Javaデザインパターン忘備録

1. Iterator

ループがデータに依存せずに行える。
Listだろうが、配列だろうが、Setだろうが、何だろうが同じような呼び出しになる。

2. Adapter

既存のクラスで実装された機能を別のクラスで使いたい時に、型変換を行い、使いたい型でその機能を使えるようにする。

3. Template Method

継承を利用して、細かい違いをサブクラスで表現しつつ、大筋のロジックを共通化できる

4. Factory Method

共通のFactoryインターフェイスとProductインターフェイスを使ってメインのプログラムを実装することにより、工場の具体的な種類(インターフェイスに実装)を変えるだけで、生成される商品の挙動を変化させることができる。

5. Singleton

クラスのインスタンスを一つだけに限定できる。

6. Prototype

あらかじめ各クラスのインスタンスを、まとめ役(Prototype役)に登録しておくことで、必要なインスタンスをまとめ役に登録されたインスタンスからコピーして作成することができる。

  • インスタンスを作成する際に、new Somethingとプログラム本体に書く必要を無くなる。
  • 多くのクラスをまとめて管理できる。
  • 生成の難しいインスタンスをコピーにより生成できる。

7. Builder

Template Methodに似ているが、これは継承ではなく委譲を利用しており、細かい違いをそれぞれ表現したクラスのメソッドを用いて、大筋のロジックを組み立てている。結果として、ロジックを共通化できる

8. Abstract Factory

何かを作りたい時(例えばhtmlファイルなど)に利用。
その作りたいものを構成する部品を作成するメソッドのインターフェイスは決まっており、そのメソッドを好きな引数で好きな回数呼び出して作りたいものを作成する。
その作りたいものを構成する部品を作成するメソッドの実装は実装クラスに任せることで、違いを表現できたり、変更に強くすることができる。
例えばhtmlの作成で。リンクの部品をクリックすると、同じタブで遷移するか新しいタブでリンクを開くかなどは、実装クラスを変えることで表現できる。

9. Bridge

機能のクラスと実装のクラス(細かい違い)を分けることができる。
すなわち、実装クラス用の共通のインターフェイスを用いて、機能のクラスではロジックを組み立てている。
こうすることで、機能追加の際には機能のクラスを追加すればよく、挙動(実装)を変更したい場合は実装クラスを変更すれば良いことになる。

10. Strategy

アルゴリズムのみを委譲によって切り替えることができる。
これにより、inputに対するoutputの算出方法を気軽に切り替えることができる。
例えば、「高速だが正確性に欠けるアルゴリズム」と「低速だが正確なアルゴリズム」を場面によって使い分けることができる。

11. Composite

容器(複数)と中身(単数)の同一視ができるようにする。
例えば、HashMapの実装で、基本は各ハッシュ値に対して中身(単数)が対応するようにするが、衝突が起きた際には、そのハッシュ値に容器(複数)を入れることで対応する。

12. Decorator

同じインターフェイスを実装したクラスならば、委譲によって何度でも機能追加を行えるようにする。
イメージは、シールドを張った人に、

  1. 炎無力化バリアを追加
  2. 水無力化バリアを追加
  3. 一定時間経過で回復するバリアを追加

を考える際に、追加する際は一つ前の状態にそのまま追加でき、最終的には全ての機能を取得した人が誕生する、というイメージ。
java.ioのInputStreamReader、BufferReader、FileReaderなどはこのパターンが使われている。

13. Visitor

データ構造と処理を分離。
データ構造を表現したクラスに対し、処理を行うクラス(実装によって何をするかは異なる)を与えると、委譲によってその処理を行うメソッド呼び出し、データの処理を行う。

14. Chain of Responsibility

処理を委譲によってたらい回しにする。
Handlerの役(処理役)は自分ができる処理のみを行い、自分の手に追えないものは次のクラスに処理を託す。
プログラム動作中に処理を行うクラスを変更することも可能。
デメリットとして、処理が遅くなる可能性あり。

15. Facade

インターフェイスを少なくし、一つの機能を表現する為に、一つのメソッドを呼べば済むようにする。具体的な他のクラスを呼んで行ったりする処理はFacade役に集約される。

16. Mediator

状態変化のロジックを一つのクラスにまとめる。
委譲を利用することにより、状態変化に応じて対象クラスの処理を呼び出す。

17. Observer

状態変化に応じた処理の記述に有効。
Subject(被験者)の役に各Observer(観察者)の役を登録し、Subjectの中の状態が変化した際には委譲を通じてObserverの対象メソッドを呼び出す。

18. Memento

インスタンスの状態を保存したい時に用いる。
Originator役は自分の状態を保存したい時にMemento役を作成し、Caretaker役の判断により以前Mementoに保存した状態に戻る。この時、カプセル化の破壊が起こらないよう、Memento役はOriginator役にはインターフェイスを広くし(パッケージを同じにするなどして)、Caretaker役にはインターフェイスを狭くする。(呼び出し可能なメソッドを少なくする。)

19. State

状態をクラスで管理。オーバーロードにより、if文などの条件分岐を用いずに状態に基づいた処理を記述することができる。

20. Flyweight

インスタンスを共有し、無駄にnewしない。インスタンスを必要とする場合には、そのFactoryクラスから生成し、そのFactoryクラスでは、すでにインスタンスが存在する場合には、そのインスタンスをそのまま使うようにする。これにより、メモリやnewにかかる時間(コンストラクタの処理にかかる時間)を節約できる。

21. Proxy

Subject役が重い処理を行うクラスのとき、その代理としてProxy役を用意する。Proxy役とSubject役はインターフェイスを共有し、なるべくProxy役が処理を行うことにより、ギリギリまでSubject役を利用しない。HTTPプロキシーのように、クライアントからの要求に対し、キャッシュが存在しない場合のみサーバに情報を取りに行くというようなイメージ。

22. Command

処理命令を1つのインスタンスとして管理。
命令の履歴管理が可能になる。
具体的には、詳細な命令を記述したクラスと、それら命令をjava.util.Stackで保存し管理するクラスを用意する。
どちらも同じインターフェイスを用いる。

23. Interpreter

Java言語を使って、目的に応じた簡単な言語を作成する。
正規表現やバッチ処理言語を記述可能。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む