Como posso gerar o método toString () dos campos?

2

Eu tenho uma classe Java que contém campos como este:

private int port;
private String portName;
private ArrayList portList;
private int id;

Eu preciso de um comando ou script para poder colar diretamente o bloco acima no terminal e fornecê-lo como entrada para esse comando ou script e fornecer a seguinte saída:

public String toString() {
    return "{ " + "port=" + port + ",portName=" + portName + ",portList=" + portList + ",id=" + id + "}";
}
    
por Kashyap Kansara 25.11.2017 / 19:41

3 respostas

3

Um oneliner usando awk (ou seja, GNU Awk):

awk 'BEGIN{printf"public String toString() {\n    return \"{ \""}{gsub(";$","");printf" + \"";if(NR>1){printf","};printf"=\" + "}END{print" + \"}\";\n}"}'

Use assim:

$ awk 'BEGIN{printf"public String toString() {\n    return \"{ \""}{gsub(";$","");printf" + \"";if(NR>1){printf","};printf"=\" + "}END{print" + \"}\";\n}"}' <<EOF
> private int port;
> private String portName;
> private ArrayList portList;
> private int id;
> EOF
public String toString() {
    return "{ " + "port=" + port + ",portName=" + portName + ",portList=" + portList + ",id=" + id + "}";
}

Versão do script com comentários explicativos

#!/usr/bin/awk -f
# do the following before processing the text
BEGIN {
  # print this text, '\n' is a line break and '\"' a literal '"'
  printf "public String toString() {\n    return \"{ \""
}
{
  # remove semicolon at the end of the line
  gsub(";$","");
  # print ' + "'
  printf " + \"";
  # if the line number is > 1 print ','
  if (NR > 1) { printf "," };
  # print the third row followed by '=" + ' and the third row again
  printf "=\" + "
}
# do the following after processing the text
END {
  # print ' + "}";\n}', '\n' is a line break
  print " + \"}\";\n}"
}

Salvar como, por exemplo, generate_toString , torne-o executável com chmod +x generate_toString e use-o da seguinte forma:

$ ./generate_toString <<EOF
> private int port;
> private String portName;
> private ArrayList portList;
> private int id;
> EOF
public String toString() {
    return "{ " + "port=" + port + ",portName=" + portName + ",portList=" + portList + ",id=" + id + "}";
}

Enquanto isso faz o que você pediu, para resolver seu problema real existem longe melhores abordagens, veja @ DavidFoerster e também por dessert 26.11.2017 / 01:12

3

Acho que é isso que você quer.

#!/bin/bash
# Create Java toString() method from stdin.

while read line; do
    word_last="${line##* }"
    name="${word_last%;}"
    if [[ $pairs ]]; then
        printf -v pair '",%s=" + %s + ' "$name" "$name"
    else
        printf -v pair '"%s=" + %s + ' "$name" "$name"
    fi
    pairs+="$pair"
done

printf '%s\n' 'public String toString() {'
printf '    return "{ " + %s"}";\n' "$pairs"
printf '%s\n' '}'

Ligue assim:

$ bash create_java_toString.sh << EOF
> private int port;
> private String portName;
> private ArrayList portList;
> private int id;
> EOF
public String toString() {
    return "{ " + "port=" + port + ",portName=" + portName + ",portList=" + portList + ",id=" + id + "}";
}

Mais exemplos:

$ bash create_java_toString.sh << EOF
> private int i;
> private int j;
> EOF
public String toString() {
    return "{ " + "i=" + i + ",j=" + j + "}";
}
$ bash create_java_toString.sh << EOF
> EOF
public String toString() {
    return "{ " + "}";
}
    
por wjandrea 25.11.2017 / 22:03
1

Eu não sei como você pretende usar esse script, mas isso deve começar na direção certa:

#!/usr/bin/env bash

# get the argumetenst from the command line

# Sample terminal usage
# tostring -p port -n portName -l portLiat -i id


echo ""
echo ""

while getopts :p:n:l:i: option
do
        case "${option}" in
                p) port=${OPTARG};;
                n) portName=${OPTARG};;
                l) portList=${OPTARG};;
                i) id=${OPTARG};;
                \?) 
                        echo ""
                        echo -e "\e[0;31m Please supply the required values: $OPTARG \e[0m" 1>&2 
                        echo ""
                        echo " Usage: tostring -p port -n portName -l portList -i id"
                        echo ""
                        exit 1
                        ;;
                : )
                        echo "Invalid option $OPTARG requires an argument" 1>&2
                        ;;
        esac
done
shift $((OPTIND -1))

echo ""
echo ""

echo -e "\e[0;33m public String toString() {"
echo -e "       return "{ " + "port=" + "$port" + ",portName=" + "$portName" + ",portList=" + "$portList" + ",id=" + "$id" "}";"
echo ""
echo ""
echo -e "}"
echo -e "\e[0m"

Mais informações:

link

    
por George Udosen 25.11.2017 / 21:51