私はゲームのようなシステムに取り組んでいます。ユーザーは、カスタマイズされた動作のために .class および .java ファイルを送信できます。一部のオブジェクトはコールバックを介してユーザーに配信されますが、ユーザーがこれらのオブジェクトを自分で (カスタム パラメーターを使用して) 構築できる場合、それはユーザーにとって有利になります。ユーザーの反射を禁止し、パッケージを封印します。すべてのパッケージ構造を放棄する (そしてコンストラクターをパッケージ プライベートにする) と、これを機能させることができますが、そうはしたくありません。
以下に例を示します。
sscce.mycode.a.SomeClass.java :
package sscce.mycode.a;
import sscce.mycode.b.RestrictedObject;
import sscce.usercode.SomeUserClass;
public class SomeClass {
public static void main(String[] args) {
SomeUserClass userClass=new SomeUserClass();
// If I can create it from here, anyone can...
RestrictedObject object=new RestrictedObject();
userClass.someMethod(object);
}
}
sscce.mycode.b.Interface.java :
package sscce.mycode.b;
public interface Interface {
public void someMethod(RestrictedObject restrictedObject);
}
sscce.mycode.b.RestrictedObject.java :
package sscce.mycode.b;
public class RestrictedObject {
public RestrictedObject() {}
}
sscce.usercode.SomeUserClass.java :
package sscce.usercode;
import sscce.mycode.b.Interface;
import sscce.mycode.b.RestrictedObject;
public class SomeUserClass implements Interface {
@Override
public void someMethod(RestrictedObject restrictedObject) {
// It receives an instance, but cannot create it.
System.out.println("Got "+restrictedObject);
}
}
動機: すべてを 1 つのパッケージにまとめるのは面倒に思えます...
パッケージを平坦化せずにこれを達成する方法についてアイデアを持っている人はいますか?
解決策、アイデア、コメントをお寄せいただきありがとうございます。Till