In original code of the JDK you find the following:

package sun.io;
import sun.nio.cs.MS1252;
public class ByteToCharCp1252 extends ByteToCharSingleByte {

   private final static MS1252 nioCoder = new MS1252();

   public String getCharacterEncoding() {
       return "Cp1252";
   }
   public ByteToCharCp1252() {
       super.byteToCharTable = nioCoder.getDecoderSingleByteMappings();
   }
}

At every instantiation of ByteToCharCp1252 every time a MS1252-object will be instantiated, just only to get the byteToCharTable. Afterwards the garbage collector may take care about it.
The MS1252 class looks correspondingly:

package sun.nio.cs;
import java.nio.charset.*;
public class MS1252 extends Charset {

   public CharsetDecoder newDecoder() {
       return new Decoder(this);
   }
   public String getDecoderSingleByteMappings() {
       return Decoder.byteToCharTable;
   }

   private static class Decoder extends SingleByteDecoder {
       public Decoder(Charset cs) {
           super(cs, byteToCharTable);
       }
       private static final String byteToCharTable =
"\u20AC\uFFFD\u201A\u0192\u201E\u2026\u2020\u2021" + // 0x80 - 0x87 "\u02C6\u2030\u0160\u2039\u0152\uFFFD\u017D\uFFFD" + // 0x88 - 0x8F
       .......
   }
}

I think, we can code this like the following:

package sun.io;
public class ByteToCharCp1252 extends ByteToCharSinglebyte {

   public String getCharacterEncoding() {
       return "Cp1252";
   }
   public ByteToCharCp1252() {
       super(sun.nio.cs.MS1252.byteToCharTable);
   }
   .......
}

package sun.nio.cs;
import java.nio.charset.*;
public class MS1252 extends US_ASCII {

   public static final String byteToCharTable =
"\u20AC\uFFFD\u201A\u0192\u201E\u2026\u2020\u2021" + // 0x80 - 0x87 "\u02C6\u2030\u0160\u2039\u0152\uFFFD\u017D\uFFFD" + // 0x88 - 0x8F
       .......

   public CharsetDecoder newDecoder() {
       return new Decoder(this, byteToCharTable);
   }

   private static class Decoder extends SingleByteDecoder {
       public Decoder(Charset cs, String byteToCharTable) {
           super(cs, byteToCharTable);
       }
       .......
   }
   .......
}

... and if we look closely a 2nd time, we will see, that the internal static Decoder class could be saved also:

package sun.nio.cs;
import java.nio.charset.*;
public class MS1252 extends US_ASCII {

   public static final String byteToCharTable =
"\u20AC\uFFFD\u201A\u0192\u201E\u2026\u2020\u2021" + // 0x80 - 0x87 "\u02C6\u2030\u0160\u2039\u0152\uFFFD\u017D\uFFFD" + // 0x88 - 0x8F
       .......

   public CharsetDecoder newDecoder() {
       return new SingleByteDecoder(this, byteToCharTable);
   }
   .......
}

If we consider, that in each Charset class that way a static Decoder and a Encoder class could be saved, the amount of classes can be saved to 1/3. This would save both startup-time and footprint of the JVM.

You can watch the progress of my work here:
https://java-nio-charset-enhanced.dev.java.net/

Regards

Ulf Zibis


Reply via email to