我正在调查分布式系统,所以......我必须了解IDL的东西。 :d 我有这个要求:
在IDL中定义 - 作为结构的帐户 - 帐户作为一系列帐户 - 具有一些帐户操作的界面客户: payIn(amount,accountId), - 如果成功则返回true,否则返回false getAccounts(name), - 返回一系列帐户(属于该人) - 具有帐户操作的界面管理员: 创建一个新帐户 删除帐户
这是我的.idl文件:
module AccountNaming
{
struct Account
{
long id;
double balance;
string name;
};
typedef sequence<Account> accounts;
interface Customer
{
boolean payIn(in double amount, in long accountId);
accounts getAccounts(in string name);
string helloCust();
};
interface Administrator
{
void createAcc();
void deleteAcc();
string helloAdmin();
};
};
我为IDL生成了所有POA,Helper,Holder类。
在我的Java代码中,我有一个使用IDL代码的类:
import AccountNaming.*;
public class CustomerImpl extends CustomerPOA
{
public String helloCust()
{
return "Hello, dear Customer! :) ";
}
@Override
public boolean payIn(double amount, int accountId)
{
// how to get to the Customer's local variables ?
super.Customer.setAmount... // or something like that, because this doesn't work... etc.
return false;
}
@Override
public Account[] getAccounts(String name)
{
// TODO Auto-generated method stub
return null;
}
}
我知道.idl文件是正确的。 &#34; helloCust / admin&#34;方法工作。我的问题是如何访问客户/管理员的变量,以便我可以在 payIn,getAccounts 方法中将它们设置为参数......
答案 0 :(得分:3)
您可以添加外观或工厂以允许您访问Customer/Administrator
接口,因此在您的IDL中您还可以:
interface UserFactory
{
Customer getCustomer(String customerName);
Administrator getAdministrator(String credentials);
}
此界面的实现可让您查找数据库等中的任何详细信息。
使用此功能,您可能不需要name
中的getAccounts()
字段(除非用于过滤),您可以这样做:
Account[] accounts = getAccounts("not-needed-anymore");
for (Account account : accounts) {
if (account.id == accountId) {
account.balance += amount;
break;
}
}
这将更新您的Account
数组信息,但您仍需要保留数据结构。
答案 1 :(得分:-1)
感谢Reimeus的快速回答,但我想到了一个更简单的解决方案:
public boolean payIn(double amount, int accountNumber)
{
boolean success = false;
for(int i = 0; i < accountList.length; i++)
{
if(accountList[i].accountNumber == accountNumber)
{
accountList[i].balance += amount;
success = true;
}
}
return success;
}
@Override
public account[] getAccounts(String name)
{
account[] accounts;
int numberOfAccounts = 0;
int count = 0;
for(int i = 0; i < accountList.length; i++)
{
if(accountList[i] != null)
if(accountList[i].name.equalsIgnoreCase(name))
{
numberOfAccounts++;
}
}
if(numberOfAccounts != 0)
{
accounts = new account[numberOfAccounts];
for(int i = 0; i < accountList.length; i++)
{
if(accountList[i].name.equalsIgnoreCase(name))
{
accounts[count] = accountList[i];
count++;
}
}
return accounts;
}
else
{
return null;
}
}