2012-03-09 3 views
0

В настоящее время я работаю над проектом, в котором пользователь может вводить пользовательские значения в графическом интерфейсе, тогда эти значения будут переведены в .class-файл, чтобы среда выполнения считывалась при запуске программы. Я понимаю, что писать файл .txt было бы намного проще, но это не то, что я хочу сделать. Новый .class-файл, который я буду делать, также будет распространяться и на абстрактный класс под названием «Проблема». Может ли кто-нибудь указать мне в правильном направлении для написания вышеупомянутого файла? Заранее благодарим за помощь! Кстати, даже если мне нужно построить файл .java, тогда скомпилируйте это как-то, это тоже может быть решением. Но все-таки, я не знаю, как это сделать:/Написание файла .class?

Подробнее Код:

package resources; 

import java.awt.Image; 
import java.io.File; 
import java.io.Serializable; 

public abstract class Problem implements Comparable<Problem>, Serializable{ 

    private static final long serialVersionUID = 42L; 
    private File locatedAt; 
    public static final int EASY = 0; 
    public static final int MEDIUM = 1; 
    public static final int HARD = 2; 

    public abstract String getTitle(); 
    public abstract String getQuestion(); 
    public abstract Image getQuestionImage(); 
    public abstract int getDifficulty(); 
    public abstract Topic getTopic(); 
    public abstract String getAuthor(); 
    public abstract boolean isCorrect(String answer); 

    public final int compareTo(Problem p){ 
     return this.getTitle().compareTo(p.getTitle()); 
    } 

    public final String toString(){ 
     return getTitle(); 
    } 

    public final void setLocatedAt(File file){ 
     locatedAt = file; 
    } 
} 


package resources; 

import java.util.StringTokenizer; 

public abstract class NumericProblem extends Problem{ 

    /** 
    * You must specify the number of significant digits the answer should contain. 
    * If you don't want to check for significant digits, simply return 0 
    * 
    * @return the number of significant digits the answer should have 
    * 
    * @since V 1.0 
    */ 
    public abstract boolean checkSigfigs(); 

    /** 
    * You must specify the amount of error from the answer the user can be within 
    * to remain correct. Your number should be represented as X% and not the decimal 
    * format. 
    * 
    * @return the amount of error the submitted answer can deviate from the specified answer 
    * 
    * @since V 1.0 
    */ 
    public abstract double getErrorPercentage(); 

    /** 
    * You must specify the type of units the problem should contain. 
    * If the answer doesn't have any units return "". Also if the units shouldn't 
    * be checked, return null. 
    * 
    * @return the unit type the answer should contain 
    * 
    * @since V 1.0 
    */ 
    public abstract String getUnits(); 

    /** 
    * You must specify the answer for the problem being asked. The number is 
    * represented as a String because of significant digits. 
    * 
    * @return the answer for the given problem 
    * 
    * @since V 1.0 
    */ 
    public abstract String getAnswer(); 


    public final boolean isCorrect(String userAnswer){ 

     String answer = getAnswer().trim(); 

     userAnswer = userAnswer.trim(); 

     StringTokenizer tokener = new StringTokenizer(userAnswer, " "); 
     if(tokener.countTokens() != 2){ 
      System.err.println("Failed at formatting"); 
      return false; 
     } 

     userAnswer = tokener.nextToken(); 
     String userUnits = tokener.nextToken(); 

     System.out.println(sigfigsIn(answer)); 
     System.out.println(sigfigsIn(userAnswer)); 

     // Checks sigificant digits 
     if(checkSigfigs()){ 
      if(!(sigfigsIn(userAnswer) == sigfigsIn(answer))){ 
       System.err.println("Failed at sig figs"); 
       return false; 
      } 
     } 

     // Checks numeric 
     if(!checkNumeric(userAnswer, answer)){ 
      System.err.println("Failed at numeric"); 
      return false; 
     } 

     //Checks units 
     if(getUnits() != null){ 
      if(!userUnits.equals(getUnits())){ 
       System.err.println("Failed at units"); 
       return false; 
      } 
     } 

     System.out.println("Passed!"); 
     return true; 
    } 

    private int sigfigsIn(String aNumber){ 

     // Removes all unnecessary zeroes before answer 
     boolean done = false; 
     boolean periodHappened = false; 

     while(!done) 
     { 
      if(aNumber.charAt(0) == '0'){ 
       aNumber = aNumber.replaceFirst("0", ""); 
      }else if (aNumber.charAt(0) == '.'){ 
       aNumber = aNumber.replaceFirst(".", ""); 
       periodHappened = true; 
      }else{ 
       done = true; 
      } 
     } 

     // If it's a number like 300 with only one sig fig, do dis 
     if(!periodHappened){ 
      if(!aNumber.contains(".")){ 
       done = false; 
       while(!done){ 
        if(aNumber.charAt(aNumber.length() - 1) == '0'){ 
         aNumber = aNumber.substring(0, aNumber.length() - 1); 
        }else{ 
         done = true; 
        } 
       } 
      } 
     } 

     return aNumber.replaceAll("\\.", "").length(); 

    } 

    private boolean checkNumeric(String Answer, String UserAnswer){ 

     double answer = Double.parseDouble(Answer); 
     double userAnswer = Double.parseDouble(UserAnswer); 
     double ep = getErrorPercentage()/100; 

     if((answer * (1+ep) >= userAnswer) && (userAnswer >= answer * (1-ep))) 
      return true; 

     return false; 

    } 



package problems; 

import java.awt.Image; 
import resources.NumericProblem; 
import resources.Problem; 
import resources.Topic; 
import resources.Formula; 

public class ANumericProblem extends NumericProblem{ 

    private final Formula formula; 

    public ANumericProblem(){ 
     formula = Formula.createRandomFormula(); 
    } 

    @Override 
    public boolean checkSigfigs() { 
     return true; 
    } 

    @Override 
    public double getErrorPercentage() { 
     return 200; 
    } 

    @Override 
    public String getUnits() { 
     return "mols"; 
    } 

    @Override 
    public String getAnswer() { 
     return Formula.getMols(); 
    } 

    @Override 
    public String getTitle() { 
     return "Formula"; 
    } 

    @Override 
    public String getQuestion() { 
     return "How many moles are in 4.9g of " + formula.getFormula(); 
    } 

    @Override 
    public Image getQuestionImage() { 
     return null; 
    } 

    @Override 
    public int getDifficulty() { 
     return Problem.EASY; 
    } 

    @Override 
    public Topic getTopic() { 
     return new Topic("Grams to Moles"); 
    } 

    @Override 
    public String getAuthor() { 
     return "Shawn"; 
    } 

} 


    } 
+0

Почему вы настаиваете на использовании этого дизайна? Это кажется творческим, конечно, но немного странным для меня, и, возможно, не лучшим способом решить эту проблему. –

+2

Используйте файл настроек для настроек, а не файл '.class'. Формат INI хорош, но XML лучше для более сложных настроек. – Blender

+0

Я также настоятельно рекомендую XML. Если вы используете JAXB, он может создавать ваши классы для вас прямо из сохраненных данных и обратно! –

ответ

1

Это не совсем то, что вы просили, но эта проблема звучит, как вы хотите, чтобы построить объект с кучей значений, затем сохраните результат позже. Если это так, то вас, вероятно, интересует object serialization, что позволяет в основном сохранить объект в виде потока байтов, а затем загрузить объект позже.

+0

@HovercraftFullOfEels Сериализация на самом деле довольно сложно сломать, если вы начинаете с определенного serialVersionUID. См. Раздел «Идентификация объектов» спецификации «Сериализация объектов». – EJP

+1

@EJP: 'serialVersionUID' гарантирует, что объект десериализуется только для экземпляра версии класса с тем же' serialVersionUID'. Для этого требуется, чтобы разработчик явно обновил 'serialVersionUID'. Это по своей сути подвержено ошибкам, поскольку не каждое обновление класса должно приводить к изменению 'serialVersionUID'. И когда 'serialVersionUID' действительно меняется, нет никакой прямой поддержки десериализации старого объекта для новой версии класса. Используя XML, мы работаем на более высоком уровне, поэтому мы можем легко настроить сериализацию (de). В идеале мы полностью избегаем использования 'serialVersionUID'. –

1

Как предложил Кен Уэйн, вам нужна сериализация объектов.

Несколько хороших библиотек для сериализации объектов являются

JAXB (XML Сериализация): http://jaxb.java.net/

Java нормальный сериализации: http://java.sun.com/developer/technicalArticles/Programming/serialization/

И как это было предложено все, .class файл, вероятно, не лучший способ пройти через это.

Смежные вопросы