code: public String[] getNames() {
          if (descriptorNames == null || descriptorNames.length == 0) {
              String title = specification.getImplementationTitle();
              if (value instanceof BooleanResult || value instanceof DoubleResult || value instanceof IntegerResult) {
                  descriptorNames = new String[1];
                  descriptorNames[0] = title;
              } else {
                  int ndesc = 0;
                  if (value instanceof DoubleArrayResult) {
                      ndesc = value.length();
                  } else if (value instanceof IntegerArrayResult) {
                      ndesc = value.length();
                  }
                  descriptorNames = new String[ndesc];
                  for (int i = 0; i < ndesc; i++)
                      descriptorNames[i] = title + i;
              }
          }
          return descriptorNames;
      }
docs: Returns an array of names for each descriptor value calculated.
  
  Many descriptors return multiple values. In general it is useful for the
  descriptor to indicate the names for each value. When a descriptor creates
  a <code>DescriptorValue</code> object, it should supply an array of names equal
  in length to the number of descriptor calculated.
  
  In many cases, these names can be as simple as X0, X1, ..., XN where X is a prefix
  and 0, 1, ..., N are the indices. On the other hand it is also possible to return
  other arbitrary names, which should be documented in the JavaDocs for the descriptor
  (e.g., the CPSA descriptor).
  
  Note that by default if a descriptor returns a single value (such as {@link org.openscience.cdk.qsar.descriptors.molecular.ALOGPDescriptor}
  the return array will have a single element
  
  In case a descriptor creates a <code>DescriptorValue</code> object with no names, this
  method will generate a set of names based on the {@link DescriptorSpecification} object
  supplied at instantiation.
  
  @return An array of descriptor names.