1
votes

Une classe ne sera pas importée dans une autre classe comment résoudre ce problème?

J'ai créé une classe qui contient des constantes comme indiqué toutes les classes sont dans le dossier src par défaut

import static SectionType.*;
public class Student {
public void addGrade(SectionType type, double grade) {
            if(type.equals(EXAM01)) {
                this.exam01 = grade;
            }
            if(type.equals(EXAM02)) {
                this.exam02 = grade;
            }
            if(type.equals(FINAL)) {
                this.finalExam = grade;
            }
            if(type.equals(LABS)) {
                this.labSum += grade;
                this.labCount++;
            }
            if(type.equals(LAB_REPORTS)) {
                this.labRSum += grade;
                this.labRCount++;
            }
            if(type.equals(HOMEWORK)) {
                this.hwSum += grade;
                this.hwCount++;
            }
        }
}

Je dois maintenant utiliser ces constantes dans une autre classe comme celle-ci

public final class SectionType {
    public static final String LABS = "LABS";
    public static final String LAB_REPORTS = "LABREPORTS";
    public static final String HOMEWORK = "HOMEWORK";
    public static final String EXAM01 = "EXAM 1";
    public static final String EXAM02 = "EXAM 2";
    public static final String FINAL = "FINAL";
}

quelle est la meilleure façon de faire fonctionner cela?


9 commentaires

Veuillez consulter la page Comment demander . Quel est le problème réel que vous rencontrez?


Il vous suffit de: importer votre.package.SectionType.LAB_REPORTS , par exemple;)


Oui, c'est ainsi que vous importez des constantes à utiliser dans une autre classe comme celle-ci. Mais par curiosité, avez-vous envisagé d'utiliser une énumération pour SectionType?


Que s'est-il passé lorsque vous l'avez essayé? (Avez-vous une erreur? Laquelle?)


@ x80486 c'est dans le package par défaut dois-je changer quoi que ce soit


@RoddyoftheFrozenPeas thew devoirs veut que cela soit fait avec les classes


SectionType n'est pas un objet, mais vous essayez de l'utiliser tel quel. Si vous utilisez plutôt enum, comme @Roddy recommandé, vous pouvez l'utiliser comme vous le souhaitez.


@meriton l'erreur donnée est Le type de section d'importation ne peut pas être résolu


@NathanHughes comment changer la première classe en énumérations?


3 Réponses :


-1
votes

si l'importation est ce que vous recherchez, importez simplement la classe comme tout autre package que vous importez

import path.where.the.package.is.className;

bien qu'il soit bon de copier la classe dans le projet sur lequel vous travaillez et puis importez-le.

également quelques suggestions sont:

  1. en utilisant static pour la classe, c'est-à-dire public static final class SectionType afin que vous n'ayez pas besoin de créer une instance de cette classe lorsque vous l'utilisez.

  2. / p>
  3. une autre option peut être d'utiliser enum


2 commentaires

les classes sont dans le dossier racine que j'ai essayé ./ et root et les deux n'ont pas fonctionné


pouvez-vous spécifier le chemin où se trouve la classe ??



0
votes

SectionType n'est pas un objet, mais vous essayez de l'utiliser tel quel. Tout ce que c'est, c'est une classe avec des membres statiques, il n'y a pas de concept de différentes instances d'une classe, chacune prenant sa propre valeur.

Pour faire fonctionner le code existant, vous pouvez changer le code pour passer une chaîne pour le type de section, comme ceci:

public abstract class SectionType {
    // left as an exercise            
}

class Lab extends SectionType {
    public Lab() {
        super("Lab");
    }

class LabReports extends SectionType {
    public LabReports() {
        super("LabReports");   
    }
}

Mais il serait préférable de faire de SectionType un enum:

public enum SectionType {
    LABS, LAB_REPORTS, HOMEWORK, EXAM01, EXAM02, FINAL
}

où cela indique spécifiquement qu'il y a un concept de SectionType où il y a une instance de celui-ci pour chaque valeur (LABS est un SectionType, LAB_REPORTS est un SectionType différent, etc. .), qui est la façon dont votre code s'attend à l'utiliser.

(L'avantage d'utiliser l'énumération est que vous pouvez profiter de la vérification de type à la compilation. Si une valeur de chaîne non valide est transmise, le code passe sans rien faire. Mais cela ne peut pas arriver avec du code utilisant des énumérations, vous devez convertir la valeur d'entrée en une énumération valide avant de pouvoir appeler le code. Lorsqu'une valeur de chaîne est entrée, elle est convertie en un enum en utilisant SectionType.valueOf, qui lèvera une exception si la valeur n'est pas valide.)

On dirait que ce que l'on vous demande de faire est d'implémenter le modèle d'énumération typeafe , comme:

import static SectionType.*;

public class Student {

public void addGrade(String type, double grade) {
            if(type.equals(EXAM01)) {
                this.exam01 = grade;
            }
            if(type.equals(EXAM02)) {
                this.exam02 = grade;
            }
            if(type.equals(FINAL)) {
                this.finalExam = grade;
            }
            if(type.equals(LABS)) {
                this.labSum += grade;
                this.labCount++;
            }
            if(type.equals(LAB_REPORTS)) {
                this.labRSum += grade;
                this.labRCount++;
            }
            if(type.equals(HOMEWORK)) {
                this.hwSum += grade;
                this.hwCount++;
            }
        }
}

qui est très similaire à enum, juste plus verbeux et plus sujet aux erreurs. Les problèmes avec ce modèle ont motivé la création d'énumérations. Reportez-vous à cet article pour une liste des raisons pour lesquelles l'implémentation d'énumérations de type sécurisé n'est pas une bonne idée.


1 commentaires

@Exodition: bien sûr. btw j'ai ajouté l'approche qui ressemble à votre cours, ainsi que des avertissements sur les problèmes si vous le faites dans la vie réelle.



0
votes

la classe addGrade a été remplacée par

public void addGrade(String type, double grade) {
            if(type.equals(SectionType.EXAM01)) {
                this.exam01 = grade;
            }
            if(type.equals(SectionType.EXAM02)) {
                this.exam02 = grade;
            }
            if(type.equals(SectionType.FINAL)) {
                this.finalExam = grade;
            }
            if(type.equals(SectionType.LABS)) {
                this.labSum += grade;
                this.labCount++;
            }
            if(type.equals(SectionType.LAB_REPORTS)) {
                this.labRSum += grade;
                this.labRCount++;
            }
            if(type.equals(SectionType.HOMEWORK)) {
                this.hwSum += grade;
                this.hwCount++;
            }
        }


0 commentaires