Kotlin의 data class에 배열을 넣으면 toString () 에 배열된 내용이 모두 표시됩니다. 곤란하면

8769 단어 AndroidKotlin
Kotlin의 데이터 클래스는 편리하지만 미묘하게 가려운 곳을 찾지 못할 때도 있다.

TL;DR(길다! 3줄!)

  • dataclass에byte수조를 저장하고 싶습니다
  • 그러나 toString () 에 배열된 내용은 모두 logcat1 줄의 버퍼도 들어가지 않습니다
  • 배열된 다른class만 저장하고 용기에 넣으면 좋아요
  • 입문


    Kotlin의 데이터 클래스로 촬영한 사진의 JPEG Buffer와 저장지 File 이름과 Meta Data 등 세트의 용기류↓는 Kotlin의 데이터 클래스가 가볍다면 좋겠다고 생각합니다.
    PhotoData.kt
    data class PhotoData(val filepath: String, val jpeg: ByteArray, val meta: String) {
    }
    
    하지만 저장 Thread에서 PhotoData#toString()을 사용하여 로그 출력을 할 때

    이렇게byte는 하나하나 Int로 변환되고 모든 요소가 표시되며 배열된 단말기나logcat의 1행문 버퍼가 사라지거나 표시됩니다.
    JPEG 데이터가 같은 건지 다른 건지 알고 싶을 뿐이지만 그렇다면 귀찮을 테니 어떻게든 해결해 보자.

    하고 싶은 일


    데이터 클래스에byte 배열 등을 저장할 때도 배열 전체를 표시하는 것이 아니라 배열이 같은지 다른지 알 수 있는 정도에 toString () 으로 yoroshicllog 출력을 하려고 합니다.

    Kotlin의 데이터 클래스는 어떻게 Java로 변환됩니까?


    따라서 데이터 클래스에서 자동으로 생성되는 toString () 이 JAVA 변환 후 어떤 코드로 바뀌었는지 살펴보겠습니다.
    ↓ 웹 사이트를 참조하여 Kotlin 코드를 JAVA로 변환합니다.
    http://tech.actindi.net/2016/12/15/kotlin.html
    PhotoData.kt
    data class PhotoData(val filepath: String, val jpegBuffer: ByteArray) {
    }
    
    이 데이터 클래스에서 자동으로 생성되는 toString () 코드가 JAVA로 변환되면 ↓ 과 같습니다.
    PhotoData.java
    public final class PhotoData
    {
        public String toString()
        {
            return (new StringBuilder())
                    .append("PhotoData(fileFullPath=")
                    .append(fileFullPath)
                    .append(", jpegBuffer=")
                    .append(Arrays.toString(jpegBuffer))
                    .append(")")
                    .toString();
        }
    }
    
    이 안에 있어요.Arrays.toString(jpegBuffer)배열이 모두 나오는 주요 원인이다.
    Array #toString () 의 사양을 찾았습니다. ↓ 과 같이 StringBuilder를 사용하여 byte를 문자열에 하나씩 밀어넣습니다.
    Arrays.java
    public static String toString(byte[] array) {
        if (array == null) {
            return "null";
        }
        if (array.length == 0) {
            return "[]";
        }
        StringBuilder sb = new StringBuilder(array.length * 6);
        sb.append('[');
        sb.append(array[0]);
        for (int i = 1; i < array.length; i++) {
            sb.append(", ");
            sb.append(array[i]);
        }
        sb.append(']');
        return sb.toString();
    }
    
    나는 바이트 배열이나 Arrays 같은 것에 손발을 대고 행동을 바꿀 수 없지만 안 될 것 같다.
    (사실은 할 수 있어! 이런 게 있으면 알고 싶어!)

    ByteArray만 저장하는class 만들기


    byte 수조를 데이터 클래스에 고스란히 저장하면 Arrays #toString () 을 사용하기 때문에 아예 수조만 저장하는class를 따로 만들어 끼워 넣고, 이class의toString () override를 사용하면 byte 수조의 직접 출력을 피할 수 있습니다.
    ↓ 이런 느낌
    PhotoData.kt
    class ByteBuffer(val buffer: ByteArray) {
        override fun toString(): String {
            return "${buffer.hashCode()}"
        }
    }
    
    data class PhotoData(val fileFullPath: String, val jpeg: ByteBuffer) {
    }
    
    이 구조로logcat에 실제 출력,
    PhotoData(
        fileFullPath=/storage/emulated/0/2017-07-29_151933.JPG,
        jpeg=164835622
    )
    
    이런 느낌의 출력은 같은 배열의 정도인지 아닌지를 판단할 수 있는 좋은 느낌의logcat이다.

    총결산


    데이터 클래스에 장수 그룹을 추가해도 로그캣은 파괴되지 않습니다.
    Kotlin의 데이터 클래스는 매우 편리하지만 Array에 가입했을 때의 toString () 의 표준 행위만 유감입니다.
    다른 더 좋은 방법이 있을 것 같아서요.
    ---///

    좋은 웹페이지 즐겨찾기