java 我可以调用一个类的同名的不同示例吗?

wko9yo5t  于 2023-02-14  发布在  Java
关注(0)|答案(4)|浏览(129)

对于我在类中处理的一个项目,我需要创建一个ArrayList,其中包含未定义数量的从属对象(类的示例),这些对象都具有不同的名称、Id等。然后,我必须调用其中一个对象,例如,更改其Id(使用类似adherent.setId(newId)的方法)。
但是,按照我的代码设置方式,所有新示例的调用都是相同的,并且因为未定义从属者的数量,所以不能简单地使用类似

Adherent adherent1 = new Adherent(lastName, firstName, currentYear, currentId);
Adherent adherent2 = new Adherent(lastName, firstName, currentYear, currentId);
Adherent adherent3 = new Adherent(lastName, firstName, currentYear, currentId);

等等......用于它们中的每一个。
这是我目前使用的方法

public static List<Adherent> createAdherent(int currentId, int currentYear, List<Adherent> adherentList) {
        Scanner sc = new Scanner(System.in);

        System.out.println("Please enter the last name of the new adherent");
        String lastName = sc.next();
        System.out.println("Please enter the first name of the new adherent");
        String firstName = sc.next();

        Adherent adherent = new Adherent(lastName, firstName, currentYear, currentId);

        adherentList.add(adherent);

        adherent.setName(lastName);
        adherent.setFirstName(firstName);
        adherent.setYearAd(currentYear);
        adherent.setId(currentId);
        System.out.println(adherent.toString());

        return adherentList;
    }

我想知道是否有一种方法可以使用它们的名称以外的东西(可能是一个变量)来调用它们(使用.set.get方法),或者是否有一种方法可以在我的createAdherent()方法中以不同的方式命名它们。我已经搜索了几天,似乎找不到答案。

cnwbcb6i

cnwbcb6i1#

你的方法很有趣。我会考虑一些重构。
首先,你要接收一个List,向它添加一个条目,然后返回那个List,返回是没有意义的,因为你已经在向列表添加条目了。
给定createAdherent(int currentId, int currentYear, List<Adherent> adherentList)的签名,您将传入一个List。
public Adherent createAdherent(int currentId, int currentYear)(如果必须,则为静态)
你可以这样称呼它:
adherents.add(createAdherent(1, 2000))
其中adherents是您传入的Adherent列表。无需获取List或返回List,只需返回要添加到List的对象。

tcbh2hod

tcbh2hod2#

据我所知,您希望通过名称调用一个项目并更改其ID,但可能有多个项目具有相同的名称。
注意:我认为如果您在构造函数本身中传递'lastName'和'firstName',它应该更新变量值,而不需要调用.setName(lastName)和.setFirstName(firstName)
回到你的问题,我相信如果你是通过名字得到obj来改变id,知道可能有不止一个名字相同,我认为这不应该发生。我相信可以这样做:

  • Op 1:防止创建同名对象,将其创建放入一个循环中,验证是否没有同名对象,如果没有,则将其添加到数组中。您甚至可以放置一条消息,说明已经有同名对象。或者返回一个错误,调用者将使用try{createAdhesent();}catch(异常e){...}
  • Op 2:不要按名称搜索,而是按id搜索(我相信这是搜索对象的最佳选择,因为id可以做到这一点),但由于它是一个数组,因此最终将遍历所有数组,这很糟糕,您可以使用Map〈Integer,Adhesent〉按id获取它。
  • Op 3:如果问题是你不知道创建了哪个'Adhesent',因为函数返回的是一个数组(我不推荐的原因是函数名),那么你可以在'createAdhesent'函数中,只返回新的'Adhesent'(这有点像是他的名字),并将其保留在需要获取其他值的情况下,这些值由另一个函数获取,例如:
public static List<Adherent> getAdherents(){
       //If you don't want to be able to delete the object from the array externally
       return Collections.unmodifiableList(adherentList);

       //Or simply
       return adherentList;
    }

或者全部使用。
希望这有帮助:)

y53ybaqx

y53ybaqx3#

你的函数 * createAdhendent * 最好命名为 * createAdhendentInList *,因为你在参数中给予了要更新的列表,而且不需要返回列表,正如已经说过的,它已经完成了。
我相信您的问题是关于为每个示例拥有唯一ID的更经典的问题。

  • 您可以决定自动生成ID,并且永远不允许外部调用更改此ID,该ID将保持唯一性。
  • 要么这个ID可以自由更改,要么除了添加时的位置外,无法区分粘附体。可以按插入顺序检索粘附体:* 相关的myList.get(位置)*.

在任何情况下,您需要一些其他函数来检索粘附体,如:

  • 根据Id查找粘附者(某些唯一Id)*
  • list findAdhendentByName(someName)* //此处返回一个列表,因为它可以有同音异义词,您必须先选择一个才能更改某些内容。

高温加热

wgx48brx

wgx48brx4#

示例不是所谓的adherent1、adherent2等。这些只是变量的名称,它们与对象的示例只有松散的关联。
您可以从adherentList.get(0)等列表中获取示例。
您可以通过for (adherent : adherentList) ...这样的构造来处理所有这些对象。
也许有更好的方法来组织数据,但这需要更多关于如何处理数据的信息。

相关问题