Change Component setFromEscapedString and setSegment to static makeFromEscapedString and makeSegment, and make the class read-only.
diff --git a/ndn-cpp/name.hpp b/ndn-cpp/name.hpp
index 587301c..cd80fac 100644
--- a/ndn-cpp/name.hpp
+++ b/ndn-cpp/name.hpp
@@ -19,12 +19,12 @@
 class Name {
 public:
   /**
-   * A Name::Component is holds an immutable name component value.
+   * A Name::Component is holds a read-only name component value.
    */
   class Component {
   public:
     /**
-     * Create a new Name::Component with an empty value.
+     * Create a new Name::Component with a null value.
      */
     Component() 
     {    
@@ -74,24 +74,23 @@
   
     const Blob& getValue() const { return value_; }
     
-    void setValue(const Blob& value) { value_ = value; }
-  
     /**
-     * Set this component value by decoding the escapedString between beginOffset and endOffset according to the NDN URI Scheme.
-     * If the escaped string is "", "." or ".." then return false, which means this component value was not changed, and
+     * Make a component value by decoding the escapedString between beginOffset and endOffset according to the NDN URI Scheme.
+     * If the escaped string is "", "." or ".." then return a Blob with a null pointer, which means this component value was not changed, and
      * the component should be skipped in a URI name.
      * @param escapedString The escaped string.  It does not need to be null-terminated because we only scan to endOffset.
      * @param beginOffset The offset in escapedString of the beginning of the portion to decode.
      * @param endOffset The offset in escapedString of the end of the portion to decode.
-     * @return True for success, false if escapedString is not a valid escaped component.
+     * @return The component value as a Blob, or a Blob with a null pointer if escapedString is not a valid escaped component.
      */
-    bool setFromEscapedString(const char *escapedString, unsigned int beginOffset, unsigned int endOffset);
+    static Blob makeFromEscapedString(const char *escapedString, unsigned int beginOffset, unsigned int endOffset);
     
     /**
-     * Set this component to the encoded segment number.
+     * Make a component as the encoded segment number.
      * @param segment The segment number.
+     * @return The component value as a Blob.
      */
-    void setSegment(unsigned long segment);
+    static Blob makeSegment(unsigned long segment);
   
   private:
     Blob value_;
@@ -198,8 +197,7 @@
    */
   void appendSegment(unsigned long segment)
   {
-    components_.push_back(Component());
-    components_.back().setSegment(segment);
+    components_.push_back(Component(Component::makeSegment(segment)));
   }
   
   /**