001    package sexp;
002    
003    /**
004     * SString represents an s-expression string, e.g. "hello".
005     */
006    public class SString implements SExp {
007        private final String value;
008    
009        private void checkRep() {
010            assert value != null;
011        }
012        
013        /**
014         * Make an SString.
015         * @requires value != null
016         */
017        public SString(String value) {
018            if (value == null) throw new IllegalArgumentException("Argument cannot be null.");
019            this.value = value;
020            checkRep();
021        }
022    
023        /**
024         * @return value of this expression
025         */
026        public String value() { return value; }
027        
028        public <T> T accept(SExpVisitor<T> visitor) {
029            return visitor.visit(this);
030        }
031    
032        @Override
033        public String toString() {
034            return "\"" + value + "\"";
035        }
036    
037        @Override
038        public int hashCode() {
039            final int prime = 31;
040            int result = 1;
041            result = prime * result + ((value == null) ? 0 : value.hashCode());
042            return result;
043        }
044    
045        @Override
046        public boolean equals(Object obj) {
047            if (this == obj)
048                return true;
049            if (obj == null)
050                return false;
051            if (getClass() != obj.getClass())
052                return false;
053            final SString other = (SString) obj;
054            return value.equals(other.value);
055        }
056    }